更新Django模型字段时的最佳实践?这就是经理课程的目的吗?

更新Django模型字段时的最佳实践?这就是经理课程的目的吗?,django,python-3.x,django-models,django-managers,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) 现在,我有一个单独的助手文件websiteheloper.py,其中有许多与数据库无关的其他函数,还有这个函数用于更新数据库中

我对Django非常陌生,我想知道更新字段的最佳实践是什么。这是我的模型:

class Website(models.Model):
  id = models.AutoField(primary_key=True)
  url = models.TextField()
  is_awesome = models.BooleanField(default=False)
现在,我有一个单独的助手文件websiteheloper.py,其中有许多与数据库无关的其他函数,还有这个函数用于更新数据库中的特定字段:

def __mark_needs_redone(Website):
  Website.update(is_awesome=True)
是否有一个更干净的地方供此类活动居住,例如:

class WebsiteManager(models.Manager)
   #Execute function here

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

如果该字段位于表单正在处理的模型上,则可以覆盖访问实际实例的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)调用,因为父级负责保存逻辑您的
update()
调用错误,您应该将其调用到模型查询集,而不是实例

    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)
如果每次
save()
都需要调用方法,请检查
pre_save信号
,如果不需要,请使用管理器

class WebsiteManager(models.Manager):
    def mark_needs_redone(self, pk):
        self.get(pk=pk).update(is_awesome = True)
将管理器添加到您的模型网站:

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)

对于
pk=1

网站,该代码将
标记为True,该代码甚至无效-
update
是查询集方法,而不是实例方法。你是想一次更新每个网站,还是只更新一个?