DJANGO 在保存时更新表中所有对象的字段
我想更新一个电子邮件表中所有对象的一个布尔字段,但我需要在保存一封电子邮件时进行这个操作。我有一个叫做Vendor(供应商)的对象和一个叫做Client(客户)的对象,它们都可以有多个电子邮件(Email/Client与电子邮件之间是一对多的关系)。这是我的电子邮件模型:
class Email(models.Model):
main = models.BooleanField("(Main)", default=False)
address = models.CharField("Email address")
limit = models.Q(app_label='store', model='store') | models.Q(app_label='core', model='client')
content_type = models.ForeignKey(ContentType,
limit_choices_to=limit,
verbose_name="Related Object Type")
object_id = models.PositiveIntegerField(verbose_name="Related Object ID")
content_object = GenericForeignKey('content_type', 'object_id')
class Meta:
app_label = 'info'
正如你所看到的,电子邮件有一个通用外键,因为它们可以属于供应商或客户模型。主要字段表示这封电子邮件是相关对象的主要电子邮件,每个相关对象只能有一封电子邮件的主要字段设置为True。
我的做法是重写保存方法:
def save(self, *args, **kwargs):
emails = Email.objects.filter(content_type__pk=self.content_type.id, object_id=self.object_id, main=True)
for email in emails:
email.main = False
email.save()
self.main = True
super(Email, self).save(*args, **kwargs)
问题是: 当我尝试保存一封电子邮件时,我会查询所有电子邮件以将主要字段设置为False,但我需要保存已修改的对象,这样就会再次调用保存函数,导致我出现错误。
有没有办法在不产生无限循环的情况下做到这一点?
1 个回答
1
你可以试试调用 update
,这个方法只是更新字段,而不会调用 save
。
def save(self, *args, **kwargs):
Email.objects.filter(content_type__pk=self.content_type.id, object_id=self.object_id, main=True).update(main=False)
self.main = True
super(Email, self).save(*args, **kwargs)
这里有关于 update
的 文档