首页 > 解决方案 > Django 在排序的查询集中注释 x 的第一次出现

问题描述

我有一个查询集,首先显示所有者的对象,然后是不属于他们的对象。

MyModel.objects.annotate(
    sort=Case(
        When(owner=self.request.user, then=0),
        default=1, output_field=IntegerField()
    )
).order_by('sort', 'name')

现在,如果这产生了以下内容,我该如何注释所有者不是请求用户的第一次出现obj_list[2]['first_occurrence'] = True呢?

obj_list = [
    {'owner': 1, 'name': 'B', 'sort': 0},
    {'owner': 1, 'name': 'D', 'sort': 0},
    {'owner': 6, 'name': 'A', 'sort': 1},
    ...
]

或者,有没有办法让第一次出现(无需重新组合),request.user != obj.owner以便我可以插入一个额外的表格行?

{% for obj in obj_list %}
    {% if obj.first_occurrence %}
        ...
    {% endif %}
    ...
{% endfor %}

标签: django

解决方案


您不能在查询本身中执行此操作,注释每行都有效,因此不可能根据查询的其余部分中的出现来注释行。

但这通常是我在视图中而不是在模板中做的事情。一旦你有obj_list,得到第一次出现:

first_occurence = next(obj for obj in obj_list if obj['sort'] == 1)

并将其作为附加变量传递给模板,以便您可以测试 if obj == first_occurence


推荐阅读