我试图以相反的顺序在模板上显示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 %}
另外,我应该像上面那样在模板上进行这种搜索吗?还是一种更好的做法是将这种搜索放在资源...的视图中。
感谢帮助。
答案 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
,否则呈现模板将导致很多额外的查询。