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

0 投票
1 回答
1790 浏览
提问于 2025-04-28 00:52

我想更新一个电子邮件表中所有对象的一个布尔字段,但我需要在保存一封电子邮件时进行这个操作。我有一个叫做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文档

撰写回答