我想更新电子邮件表中所有对象的一个布尔字段,但我需要在保存一封电子邮件时执行此操作。我有一个名为Vendor的对象和其他名为Client的对象,两者都可以有多个Email,(Email / Client与电子邮件有OneToMany关系)这是我的电子邮件模型:
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'
正如您所看到的,电子邮件具有通用外键,因为它们可以属于供应商或客户端模型,主要字段表示此电子邮件是相关对象的主要内容,每个相关对象只有1封电子邮件可以具有main = 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,但我需要保存修改后的对象,它会再次调用保存功能给我错误。
有没有办法在没有无限循环的情况下做到这一点?
答案 0 :(得分: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)