Django - 获取与许多字段相关的模板反向

时间:2015-07-14 14:57:35

标签: django django-models django-templates django-views

我有3个模型,Entry模型和Category模型,我创建了中间模型CategoryEntry。

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)

我用这样的

创建了一个带有get_queryset方法的View
    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的类别ID。问题是 - 如何让每个条目相关的字段“查看”,所以我可以在模板中显示它的值。例如相关的用户字段我可以像

{% 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))))

谢谢!

1 个答案:

答案 0 :(得分: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访问反向查找元素 - 它返回一个查询集管理器对象。