如何使Django模型在

2024-05-23 13:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要什么

我有一个专栏“长度”在模型集,和另一个专栏“和长度”在系列。在

我希望sum_长度只在剧集创建时更新,而不在我修改时更新。在

我现在怎么做?在

现在,我重写save函数,并添加一个函数调用来更新它,就像这样。在

def save(self, *args, **kwargs):
    if not self.excerpt:
        md = markdown.Markdown(extensions=[
            'markdown.extensions.extra',
            'markdown.extensions.codehilite',
        ])
        self.excerpt = strip_tags(md.convert(self.description))[:54]
        self.series.addlength(self.video_length)
    super(Episode, self).save(*args, **kwargs)

由于我的摘录是由降价内容生成的,所以我认为当摘录为空时,是保存而不是更新

我为什么问这个问题?在

  1. 我的解决方案是有用的,但我想找到一个更python代码
  2. 当我真的需要更新时,我的工作区不会更新。在

你能给我什么?在

也许一个示例代码就可以了

其他信息

丹戈:1.11.6 Python:3.6.3 数据库:MySQL

感谢您的回答


Tags: 函数代码模型selfsaveargsextensionsmd
2条回答

有两种方法可以做到这一点。在

  1. 像以前一样重写save()方法

    还有两种检查对象是否已保存的方法。在

    a.检查主键(pk)。在

    我们可以简单地检查primary是否为None,因为只有在对象保存到数据库之后才设置主键。在

    self.pk is None  
        #not saved
    else
        #already saved instance
    

    如果在模型类中设置了(主键=True),则此解决方案将无法正常工作。在

    Django还提供了另一种检查方法

    来自https://docs.djangoproject.com/en/2.0/ref/models/instances/#customizing-model-loading

    if self._state.adding == True 
       #not saved
    elif self._state.adding == False 
       #already saved instance
    
  2. 执行后存储信号 https://docs.djangoproject.com/en/1.11/ref/signals/#django.db.models.signals.post_save

    该信号提供一个布尔属性,其名称已创建。如果创建了新记录,则其值将true;如果该记录已创建,则其值将为False。 这是最干净的解决方案,如果您想实现太多的逻辑,必须使用它

    按照这个简单的教程来实现保存后信号https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html

如果逻辑简单,并且您只想为一个模型提供功能,请选择第一个选项。在

选择第二个选项,这取决于代码的长度,如果要扩展多个模型类的功能。在

您可以将此功能移到模型表单中,而不是重写模型的保存。它会给你更多的灵活性。在

在这种情况下,您可以创建两个不同的表单,比如一个为普通用户创建,其中的摘录将在创建时更新,管理表单将在必要时重写摘录。在

class AdminForm(forms.ModelForm):

  class Meta:
    model = Episode

  def save(self, excerpt=None, force_insert=False, force_update=False, commit=True):

    object = super(Episode, self).save(commit=commit)

    if excerpt:
        object.excerpt = excerpt

class UserForm(forms.ModelForm):

  class Meta:
    model = Episode

  def save(self, excerpt=None, force_insert=False, force_update=False, commit=True):

    object = super(Episode, self).save(commit=commit)

    if not object.excerpt and excerpt:
        object.excerpt = excerpt

相关问题 更多 >