У меня есть 3 модели, модель ввода и категория, и я создал промежуточную модель CategoryEntry.Django - получить в шаблоне обратное отношение много ко многим поля
class Entry(models.Model):
entry_text = models.TextField()
user = models.ForeignKey(User)
class Category(models.Model):
user = models.ForeignKey(User)
category_text = models.CharField(max_length=200)
entries = models.ManyToManyField(Entry, through='CategoryEntry')
class CategoryEntry(models.Model):
category = models.ForeignKey(Category)
entry = models.ForeignKey(Entry)
viewed = models.BooleanField(default=False)
Я создал View с get_queryset методом, как этот
def get_queryset(self):
order_by = self.request.GET.get('order_by')
if not order_by:
order_by = '-pub_date'
return Entry.objects.filter(category__id=self.kwargs.get('category_id', None), category__user__id=self.request.user.id).order_by(order_by)[:].select_related('user')
У меня есть идентификатор категории от kwargs. Проблема заключается в том, как получить каждое поле, связанное с полями, «просматривается», поэтому я могу показать его значение в шаблоне. Например, связанное поле User можно получить как
{% for entry in entries %}
{{ entry.entry_text }}
{{ entry.user.name }}
{% endfor %}
Что мне нужно, чтобы получить доступ к «просматривались» поле что-то вроде «entry.categoryentry.viewed»
Пробовал prefetch_related, но, кажется, не работают или не получить, как узнать правовое имя для доступа к полю в шаблоне
Entry.objects.filter(category__id=self.kwargs.get('category_id', None), category__user__id=self.request.user.id).order_by(order_by)[:].select_related('user').prefetch_related(Prefetch("categoryentry_set", queryset=CategoryEntry.objects.filter(category__id=self.kwargs.get('category_id', None))))
Спасибо!
Это должно быть {% endfor%} instand {% endif%}. Я не могу исправить, потому что слишком мало изменений, извините. – Tobit
NIce catch - спасибо @Tobit – karthikr