DJANGO在保存时更新表中所有对象的字段

时间:2014-10-16 21:23:25

标签: python django django-models django-admin

我想更新电子邮件表中所有对象的一个​​布尔字段,但我需要在保存一封电子邮件时执行此操作。我有一个名为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,但我需要保存修改后的对象,它会再次调用保存功能给我错误。

有没有办法在没有无限循环的情况下做到这一点?

1 个答案:

答案 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)

以下是documentation on update