首页 > 解决方案 > Django 查询首先保留特定项目,然后将 order_by 应用于其余项目

问题描述

假设我们有一个 Article 模型。

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

我想获取所有文章,但名称为“stackoverflow”的文章应该是查询集中的第一项并将 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 次。我们能以更好的方式做到这一点吗?

标签: pythonsqldjangodjango-querysetdjango-orm

解决方案


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/

首先订购具有特定对象的 django 查询集


推荐阅读