【问题标题】:DJANGO Update field of all objects in a table on saveDJANGO 在保存时更新表中所有对象的字段
【发布时间】: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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      相关资源
      最近更新 更多