在 Django 中,我确实有两个模型“作者”和“出版”,它们与多对多字段连接,以便我可以将不同的作者分配给出版物。此外,我必须使用自定义的贯穿模型“作者身份”来定义正确的顺序。
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="")
目前,我使用管理界面使用“出版物”表单和内联表单“作者”来填充我的数据。
我现在想要实现的目标:
数据更改后应自动填充附加的 itation_key-field(例如“Einstein1950”)。
我尝试做的事情:
我发现使用signals https://docs.djangoproject.com/en/dev/topics/signals/必须是最佳实践。
然而,当我更改作者身份时,“Publication.authors.through”上的“m2m_changed”信号不会被触发。
@receiver(m2m_changed, sender=Publication.authors.through)
def authors_changed(sender, **kwargs):
print("authors changed")
这个问题也在一篇文章中讨论过相关主题 https://stackoverflow.com/questions/12689721/django-m2m-changed-signal-with-custom-through-model,作者似乎在直通模型上使用了“post_save”。
@receiver(post_save, sender=Authorship)
def authorship_changed(sender, instance, **kwargs):
print("authors changed")
这似乎可行,但我必须记住,删除尚未涵盖,所以我添加了一个 post_delete-signal:
@receiver(post_delete, sender=Authorship)
def authorship_deleted(sender, instance, **kwargs):
print("authors deleted")
现在的问题是:如果我添加 4 位作者,则该事件会被触发 4 次。如果我想像之前描述的那样更新我的引用密钥,这种情况也会发生 4 次。
这是正确的解决方案吗?或者有更好的最佳实践吗?我认为它必须以某种方式与 m2m_changed 信号一起工作,但我不知道如何。
由于我是 Django 新手,我不知道这对您来说是否是明显的解决方案。此外,在这种情况下,不必要的计算不应该产生巨大的影响,但它一点也不好。
我只找到了一个很旧的错误报告 https://code.djangoproject.com/ticket/13757在 Django-Trac 中似乎也解决了这个问题。但目前还没有解决办法。