过滤查询集中每个项目的相关对象

时间:2014-03-24 11:24:55

标签: django django-queryset manytomanyfield

我有一个可以被用户标记的模型(我们称之为' item')。标签特定于每个用户。因此,例如,一个项目可以由多个用户拥有多个标签。我需要向用户显示所有项目的列表。在该列表中,我希望能够仅显示当前登录用户拥有的每个项目的标签。我希望有一种相当简单的方法来实现这一目标,但我一直无法在文档中找到任何有用的信息。提前谢谢。

class Item
     tags = ManyToManyField('tags.Tag')

class Tag
     user = ForeignKey('auth.User')

因此,我收集要在页面上显示的项目的查询集,并在模板中列出它们。我希望能够仅为查询集中的每个项目显示当前登录用户拥有的标记。

{% for item in items %}
      {% for tag in item.tags %}
            DISPLAY TAGS OWNED BY LOGGED IN USER
      {% endfor %}
{% endfor %}

这就是我想要实现的目标^

1 个答案:

答案 0 :(得分:0)

一种方法是将属性添加到您可以在视图中设置的Item类user_tags,然后将标记过滤为仅匹配登录用户的那些。

# models.py
class Item(models.Model):
    ...

    user_tags = []
    ...

# views.py
items = Item.objects.all().select_related('tags')
for item in items:
    item.user_tags = [tag for tag in item.tags if tag.user = logged_in_user]

然后在你的模板中你可以迭代它们:

{% for item in items %}
    {{ item }}
    {% for tag in item.user_tags %}
        {{ tag }}{% ifnot forloop.last %}, {% endif %}
    {% endfor %}
{% endfor %}
警告:我不再是SQL上的佼佼者了,所以完全有可能将一个额外的WHERE参数传递给select_related以仅加入该用户id的标签。不幸的是,今天早上我没时间,但我会检查你。