Django 查询首先保留特定项目,然后将 order_by 应用于其余项目

时间:2021-03-18 15:50:00

标签: python sql django django-queryset django-orm

假设我们有一个文章模型。

class Article(models.Model):
    id = int
    name = char

我想获取所有文章,但 name = "stackoverflow" 的文章应该是 queryset 中的第一项,并将 order_by 应用于其余项。例如 .order_by("name").

到目前为止我所取得的是

queryset = Article.objects.all().order_by("name")
stackoverflow = queryset.get(name="stackoverflow")
query = queryset.exclude(name="stackoverflow")
articles = []
articles.extend(stackoverflow)
articles.extend(query)

但这至少会访问数据库 4 次。 我们能否以更好的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

from django.db.models import Case, When

articles = Article.objects.order_by(
    Case(When(name="stackoverflow", then=0), default=1)
)

参考:https://docs.djangoproject.com/en/3.1/ref/models/conditional-expressions/

Order a django queryset with specific objects first