Django中的递归关系:从每条记录中获取所有相互关联的记录

Recursive relationship in Django: get all the interrelated records from each record

我有一首曲子的模型:

class MsTune(models.Model):

    name = models.CharField(max_length=255)
    ms = models.ForeignKey(Manuscript, on_delete=models.CASCADE, related_name="mstunes")
    concordances = models.ManyToManyField("self", blank=True)

我有很多稿件(ms),同一个曲调可能出现在不止一篇稿件中。我想用 concordances 字段做的是 link 所有相似的曲调。这部分有效。 Django 管理 back-end 允许我 select 许多曲调 linked 到我正在编辑的当前曲目:

问题是我想看看我link编辑过的所有曲调。例如,在上面的示例中,Mary Scott... 应该列出所有三首曲调(Courante、Almain、Hopetounsetc...); Courante 应该列出其他三个(Mary Scott、Almain、Hopetoun's)。现在他们只显示我从哪个编辑页面添加了他们。我错过了什么?我必须创建一个新的 concordances 模型吗?

PS

指定 symmetrical=True 没有帮助。

更好地解释我想要实现的目标

如果我有这些曲子:

tune_1
tune_1a
tune_1b
tune_2

现在我得到这个:

tune_1:
concordances.all: tune_1a, tune_1b

tune_1a:
concordances.all: tune_1

tune_1b:
concordances.all: tune_1

我想要这个:

tune_1:
concordances.all: tune_1a, tune_1b

tune_1a:
concordances.all: tune_1, tune_1b

tune_1b:
concordances.all: tune_1, tune_1a

有中介模型的部分解决方案

假设我使用中介模型:

class MsTune(models.Model):

    related = models.ManyToManyField('MsTune', through='Concordance', blank=True)
[...]

class Concordance(models.Model):
    tune = models.ManyToManyField(MsTune)
    title = models.CharField(max_length=64)

    def __str__(self):
        return self.title

然后如何在显示特定曲调详细信息的模板中访问相关曲调列表?

{% for concordance in tune.concordance_set.all %} {{ concordance__mstune_id }}{% endfor %}

不输出任何东西; [...]{{ concordance }}[...] 输出索引的名称,而不是每首曲子的标题。

访问 {{ tune.concordances }} 时出现 'ManyToManyField' object has no attribute '_m2m_reverse_name_cache' 错误。

我通过创建不同的模型解决了问题:

class Concordance(models.Model):
    name = models.CharField(max_length=64)
    tunes = models.ManyToManyField(MsTune, related_name="concordances")

    def __str__(self):
        return self.name