【问题标题】:Django query to keep perticular item at first and then apply order_by to rest of the itemsDjango 查询首先保留特定项目,然后将 order_by 应用于其余项目
【发布时间】:2021-06-16 01:19:23
【问题描述】:

假设我们有一个 Article 模型。

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

我想获取所有文章,但 name = "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 次。 我们能以更好的方式做到这一点吗?

【问题讨论】:

  • 5 次怎么样?据我了解,这个 sn-p 应该只进行两个查询。检查When QuerySets are evaluated - Django docs
  • 它被击中 4 次。 stackoverflow = queryset.get(name="stackoverflow") 这里 1 query = queryset.exclude(name="stackoverflow") 这里 1 articles.extend(stackoverflow) 这里 1 articles.extend(query) 这里 1

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多