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
我有一首曲子的模型:
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