Вы не можете получить доступ к m2m в наборе запросов. allParts
- это набор запросов всех частей, в то время как .patterns
указывает на связанные с m2m объекты для каждого экземпляра, а не на весь набор запросов.
Чтобы получить все отношения m2m для набора запросов, необходимо выполнить запрос, подобный следующему:
parts = Part.objects.all() # or filter
patterns = Pattern.objects.filter(patterns__in=parts)
Вы можете оптимизировать код, чтобы меньше попадать в вашу базу данных:
parts = Part.objects.all().prefetch_related("pattern")
Таким образом, django выполнит еще один запрос, чтобы получить все связанные шаблоны и добавляет их к каждой части в python. затем вы просто используете результат, не делая дополнительных запросов к базе данных:
for part in parts:
patterns = part.patterns.all() # this won't hit the database for each part.
Кроме того, вам нужно использовать для l oop в вашем шаблоне, так как patterns
будет указывать на список шаблонов, а не только объект:
{% for part in parts %}
<tr>
...
<td>
{% for pattern in part.pattern.all %}
<span>{{ pattern.patternName }}</span>
{% endfor %}
</td>
...
</tr>
{% endfor %}
Примечания:
Вы, вероятно, должны использовать parts
вместо part
для отношения m2m
.
related_name
используется для обратного поиска, что означает, что когда вы хотите получить доступ к деталям из Pattern
модели.
Изменение related_name
на "parts"
делает больше смысла, поскольку он используется при обратном поиске для Pattern
модели.