【发布时间】:2014-10-17 05:45:54
【问题描述】:
我想更新电子邮件表中所有对象的一个布尔字段,但我需要在保存一封电子邮件时执行此操作。我有一个名为 Vendor 的对象和另一个名为 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'
你可以看到email有一个genericforeignkey,因为它们可以属于vendor或者client模型,main字段表示这个email是相关对象的main,每个相关对象只有1个email可以有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,但我需要保存修改过的对象,它结束再次调用保存函数给我错误。
有没有办法做到这一点没有无限循环?
【问题讨论】:
标签: python django django-models django-admin