Django 查询自引用多对多关系
我想从我的数据库中获取所有手稿的列表,打印出每个手稿的架号。如果这些手稿还链接了其他手稿,我也想打印出那些手稿的架号。
这是我的模型的样子:
class MSS(models.Model):
shelfmark = models.CharField(max_length=50)
MSSLink = models.ManyToManyField('self',through='MSSLink',symmetrical=False)
[...]
class MSSLink(models.Model):
link1 = models.ForeignKey('MSS', related_name='First_MSS')
link2 = models.ForeignKey('MSS', related_name='Second_MSS')
[...]
这是views.py中的代码:
def show_all_MSS(request):
all_MSS = MSS.objects.select_related().all() # get all MSS
t = loader.get_template('list.html')
c = Context({'all_MSS': all_MSS, })
return HttpResponse(t.render(c))
接下来我在模板中该怎么做呢?我想过这样做,但我不知道怎么判断当前循环中的手稿是否链接了其他手稿,如果是的话,怎么显示那些架号:
{% if all_MSS %}
<ul>
{% for i in all_MSS %}
<li><a href="/MSS/{{ i.shelfmark}}/">{{ i.shelfmark }}</a></li>
{% if i.MSSLink %}
<p>This MS is linked to the following MSS: {{ i.MSSLink.link1 }}</p>
{% endif %}
{% endfor %}
</ul>
{% else %}
<p>No MSS found</p>
{% endif %}
1 个回答
0
你的模型有点复杂——其实你可以去掉MSSLink这个东西:
class MSS(models.Model):
shelfmark = models.CharField(max_length=50)
links = models.ManyToManyField('self', symmetrical=False, blank=True)
def __unicode__(self):
return self.shelfmark
然后在你的模板里加上这个:
{% if i.links.all %}
<ul>
{% for l in i.links.all %}
<li><a href="/MSS/{{ l.shelfmark}}/">{{ l.shelfmark }}</a></li>
{% endfor %}
</ul>
{% endif %}