如何在模板上显示Django ManyToMany?需要简单的代码

时间:2019-05-30 17:10:31

标签: django

我试图以相反的顺序在模板上显示ManyToMany字段。

这是我的意思:

当ManyToMany字段是模型中使用的字段时,我设法在模板上显示ManyToMany字段,例如:

<br/>{% for tag in post.tag.all %}{{ tag }}<br/>{% endfor %}

将基于该模型显示帖子所属的所有标签(含义类别):

class Post(models.Model):
tag = models.ManyToManyField(Tag,blank=True,null=True,related_name='tag')

现在我想要相反的东西-当ManyToMany字段在Author模型中时显示帖子的作者(上面的Post模型保持不变):

class Person(models.Model):
post=models.ManyToManyField(Post,blank=True,null=True,related_name='post')

我非常确定这与相关对象引用(https://docs.djangoproject.com/en/2.2/ref/models/relations/)有关

只是无法使其工作。

我已经在模板上尝试了以下内容。

{% for post in posts %}
{% for author in post.person_set.all %}{{author}}<br/>{% endfor %}
{% endfor %}

另外,我应该像上面那样在模板上进行这种搜索吗?还是一种更好的做法是将这种搜索放在资源...的视图中。

感谢帮助。

1 个答案:

答案 0 :(得分:1)

您对related_name= parameter [Django-doc]的操作有误解。就像文档中说的那样:

  

用于从关联对象到该对象的关联的名称。 (...)

所以它是 reverse 中关系的名称。为了使模型“听起来不错”,因此应将其命名为:

class Person(models.Model):
    posts = models.ManyToManyField(Post, blank=True, null=True, related_name='authors')

在这里使用复数也很有意义,因此使用posts而不是post

在这种情况下,您可以使用以下方式呈现该信息:

{% for post in posts %}
    {% for author in post.authors.all %}{{author}}<br/>{% endfor %}
{% endfor %}

请注意,如果要呈现ManyToManyField的所有值,则最好在查询集中使用.prefetch_related(..)来预取Person,否则呈现模板将导致很多额外的查询。