我是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
这是应该使用管理者的方式吗?如果没有,这里的最佳做法是什么?
答案 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
的真