更新Django模型字段时的最佳做法?这是经理类的目的吗?

时间:2018-07-31 04:33:01

标签: django python-3.x django-models django-managers

我是Django的新手,我想知道更新字段的最佳实践是什么。这是我的模型:

class Website(models.Model):
  id = models.AutoField(primary_key=True)
  url = models.TextField()
  is_awesome = models.BooleanField(default=False)

现在,我有一个单独的帮助程序文件WebsiteHelper.py,其中包含许多其他功能,这些功能与数据库无关,而且还具有用于更新数据库中特定字段的功能:

def __mark_needs_redone(Website):
  Website.update(is_awesome=True)

是否有更清洁的生活空间,例如:

class WebsiteManager(models.Manager)
   #Execute function here

这是应该使用管理者的方式吗?如果没有,这里的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

如果该字段位于表单正在处理的模型上,则可以覆盖访问实际实例的 save()方法。

    class Website(models.Model):
        id = models.AutoField(primary_key=True)
        url = models.TextField()
        is_awesome = models.BooleanField(default=False)

        def save(self, commit=True):
            self.instance.is_awesome = True
            return super().save(commit)

别忘了 super()。save(commit)调用,因为父级负责保存逻辑

答案 1 :(得分:0)

您的update()调用方式错误,应将其调用到模型查询集而不是实例。

如果您需要为每个save()调用方法,请检查pre_save signal,但如果不需要,请使用 Manager

class WebsiteManager(models.Manager):
    def mark_needs_redone(self, pk):
        self.get(pk=pk).update(is_awesome = True)

在您的模型网站中添加Manager:

class Website(models.Model):
    id = models.AutoField(primary_key=True)
    url = models.TextField()
    is_awesome = models.BooleanField(default=False)

    objects = WebsiteManager()

用法是:

Website.objects.mark_needs_redone(pk=1)

该代码会将is_awesome中的Website标记为pk=1