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

Django - get in template reverse related many to many field

我有 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 这样的方法创建了一个视图

    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。问题是 - 如何获取每个条目相关字段 "viewed",以便我可以在模板中显示它的值。例如相关的 User 字段我可以得到 like

{% for entry in entries %}
    {{ entry.entry_text }}
    {{ entry.user.name }}
{% endfor %}

我需要访问 "viewed" 字段,例如 "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))))

谢谢!

你会这样做:

{% 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 访问反向查找元素 - returns 一个查询集管理器对象。