Как отобразить Django ManyToMany в шаблоне? Нужен простой код - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь отобразить поле 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 (модель сообщения выше остается прежней):

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

Я совершенно уверен, что это как-то связано со ссылкой на связанный объект (* 1015)*

Просто не могу заставить его работать.

Я попробовал следующее на шаблоне.

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

Кроме того, я буду делать такой поиск по шаблону, как указано выше, илилучше ли ставить подобные поиски в представлениях ... ресурсным способом.

Спасибо за помощь.

1 Ответ

1 голос
/ 30 мая 2019

Вы неправильно понимаете, что делает параметр related_name= [Django-doc] . Как сказано в документации:

Имя, используемое для отношения от связанного объекта к этому . (...)

Так что это имя отношения в reverse . Для того, чтобы ваши модели «звучали», вы должны назвать это следующим образом:

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

Здесь также имеет смысл использовать множественное число , поэтому posts вместо post.

В этом случае вы можете сделать это с помощью:

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

Обратите внимание, что если вы хотите отобразить все значения для ManyToManyField с, лучше использовать .prefetch_related(..) в наборе запросов для предварительной выборки Person, иначе шаблон приведет к большому количеству дополнительных запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...