2

我的 django 视图中有一个查询集。

我想更改其中一个项目的位置,使其成为查询集的第一个元素。

关于如何做到这一点的任何想法?

编辑:

我有一个查询集:

   qs = UserProfile.objects.filter(myfilter=whatever)

我知道在这个查询集中我有:

   specific_user.userprofile

我想要做的是将 user.userprofile 放在我的查询集中的第一个位置,因为我在模板的循环中使用了这个查询集:

    {% for i in qs %}
    <div> i.name </div>

我想确保列表的第一个名称是 specific_user 的名称。

4

2 回答 2

6

QuerySetDjango 中的对象是数据库查询结果的抽象表示。一般而言,它表示当请求查询集中的特定对象时可能稍后执行的 SQL,但在此之前,不会执行任何查询。所以你真的不能把查询集想象成一个列表,它可能会被任意重新排序。您可以请求查询集中的对象使用其order_by方法进行排序,因此如果您希望特定对象排在第一位,则它必须在数据库端具有一些可排序的属性,以便对其进行排序。这可以是一个列,也可以是使用F 表达式从其列计算的值。

但是,根据您的需要,您似乎可以在视图中列出您的查询集:

profiles = [specific_user.userprofile] + [profile for profile in UserProfile.objects.filter(myfilter=whatever).exclude(id=specific_user.userprofile.id)]

将其添加到您的上下文中并对其进行迭代,而不是模板中的原始查询集。

于 2012-11-20T21:46:13.930 回答
3

从 Django 1.8 开始,您可以使用条件表达式来定义特定顺序。

当 UserProfile 为 specific_user.userprofile 时,您将设置一个特殊情况:

qs = UserProfile.objects.filter(myfilter=whatever)\
.order_by(Case(When(pk=specific_user.userprofile.pk, then=0), default=1)))

我们在特殊情况下设置为 0,默认设置为 1。这样,指定的用户将始终首先显示。

于 2020-12-30T14:38:43.097 回答