通过模型

时间:2015-04-29 18:58:49

标签: django django-models django-signals

在Django中,我确实有两个模型"作者"和"出版物"与多对多字段连接,以便我可以为出版物分配不同的作者。另外,我必须使用自定义的直通模型" Authorship"定义正确的顺序。

class Author(models.Model):
    first_name = models.CharField(max_length=48)
    .....


class Authorship(models.Model):
    author = models.ForeignKey(Author)
    publication = models.ForeignKey('Publication')
    order_of_authorship = models.IntegerField(default=1)


class Publication(models.Model):
    title = models.CharField(max_length=128)
    authors = models.ManyToManyField(Author, through=Authorship)
    year = models.IntegerField(max_length=4)
    ...

    citation_key = models.CharField(max_length=9, blank=True, default="")

目前,我使用管理界面使用" Publication"的表单填充我的数据。和内联形式" Authorship"。

我现在想要实现的目标: 数据发生变化后,应自动填充一个额外的citation_key-field(例如" Einstein1950")。

我试图做的事情: 我发现使用signals必须是最好的做法。

然而" m2m_changed" -Signal on" Publication.authors.through"当我改变作者身份时,并没有被解雇。

@receiver(m2m_changed, sender=Publication.authors.through)
def authors_changed(sender, **kwargs):
    print("authors changed")

这个问题也在related topic中讨论,作者似乎使用" post_save"通过模型。

@receiver(post_save, sender=Authorship)
def authorship_changed(sender, instance, **kwargs):
    print("authors changed")

这似乎有用,但我必须记住,还没有涵盖删除,所以我添加了post_delete信号:

@receiver(post_delete, sender=Authorship)
def authorship_deleted(sender, instance, **kwargs):
    print("authors deleted")

现在的问题是:如果我添加4位作者,我会将该事件触发4次。如果我想如前所述更新我的citation_key,这也会发生4次。

这可以是正确的解决方案吗?还是有更好的最佳做法?我认为它必须以某种方式使用m2m_changed信号,但我不知道如何。 由于我是Django的新手,我不知道这对你来说是否是一个明显的解决方案。此外,在这种情况下,不必要的计算不应该产生巨大的影响,但它并不好。

我只在Django-Trac中发现了一个非常古老的bug-report,似乎也解决了这个问题。但还没有解决方案。

1 个答案:

答案 0 :(得分:0)

这是一个已知错误,在Django上报告为ticket 17688