在Queryset中移动一个元素

时间:2012-11-20 21:23:42

标签: python django

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

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

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

编辑:

我有一个查询集:

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

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

   specific_user.userprofile

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

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

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

2 个答案:

答案 0 :(得分:6)

Django中的

QuerySet个对象是数据库查询结果的抽象表示。一般来说,它表示在请求查询集中的特定对象时可能稍后执行的SQL,但在此之前,不会执行任何查询。因此,您无法真正想到像列表这样的查询集,可能会被任意重新排序。您可以使用其order_by方法请求查询集中的对象进行排序,因此,如果您希望首先使用特定对象,则必须在数据库端具有某些可排序属性,以便对其进行排序。这可以是使用F expressions从其列计算的列或值。

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

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

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

答案 1 :(得分:3)

从 Django 1.8 开始,您可以使用 Conditional Expressions 来定义特定的顺序。

当 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。 这样,指定的用户将始终首先显示。