2015-07-14 12 views
0

У меня есть 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)))) 

Спасибо!

ответ

2

Вы бы:

{% for entry in entries %} 
    {{ entry.entry_text }} 
    {{ entry.user.name }} 
    {% for ce in entry.catalogentry_set.all %} 
     {{ce.category.category_text}} 
     {# or whatever.. #} 
    {% endfor %} 
{% endfor %} 

В принципе, если нет related_name нет, вы можете получить доступ к обратному элементу подстановки по lowercase model name + _set - который возвращает объект менеджера QuerySet.

+0

Это должно быть {% endfor%} instand {% endif%}. Я не могу исправить, потому что слишком мало изменений, извините. – Tobit

+0

NIce catch - спасибо @Tobit – karthikr

Смежные вопросы