【问题标题】:Updating models to reflect changes to other models更新模型以反映对其他模型的更改
【发布时间】:2011-10-15 15:02:35
【问题描述】:

我正在开发一个系统,用户需要匹配来自多个模型的模型字段。为了帮助他们,我创建了一个“is_orphan”布尔字段来指示所需的关系(在本例中为外键)是否应该存在但还不存在。它作为保存例程的一部分进行更新 - 示例如下:

class Caption(models.Model):
    caption = models.TextField()
    is_orphan = models.BooleanField()

    def save(self, *args, **kwargs):
        art_set = self.art_set.all()
        if len(art_set) != 0:
            self.is_orphan = False
        else:
            self.is_orphan = True
        super(Caption, self).save(*args, **kwargs)

我的问题是,当我使用管理员从关系的另一端(艺术)释放标题时,除非我通过标题保存例程,否则不会反映标题孤儿状态的变化。每当用户将与标题关联的艺术更改为新标题或根本没有标题时,是否有办法在 Art 模型中自动更新 caption.is_orphan

【问题讨论】:

  • 我不明白你想要什么,但我想你需要重写 Art 模型的保存方法,而不是 Caption 并且在 self.is_orfan 中你更改为 self.caption.is_orphan。我可以看到 Art 的模型结构吗?

标签: python django django-models django-admin


【解决方案1】:

save方法的Art模型中:

def save(self, *args, **kwargs):
    old_caption = None
    if self.id:
        old_caption = Art.objects.get(id=self.id).caption
    super(Art, self).save(*args, **kwargs)
    if old_caption and (self.caption != old_caption):
        if old_caption.art_set.all():
            old_caption.is_orphan = False
        else:
            old_caption.is_orphan = True
        old_caption.save()

【讨论】:

  • 谢谢西蒙。有效。我在示例末尾添加了三行来更新新分配或新创建的标题。
猜你喜欢
  • 2021-12-26
  • 2018-07-10
  • 2016-06-10
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多