python - 使用带有条件的order_by时出现奇怪的海狸无法将关键字'-pub_date解析为字段
问题描述
这段代码工作正常,除了它不是我想要的结果。对于每个案例,它的顺序从旧的到新的
def get_queryset(self, *args, **kwargs):
return super(PublishedManager, self).get_queryset().filter(
pub_date__lte=timezone.now(), status="published").order_by(
Case(When(status_ranking='1', then='pub_date')).asc(),
Case(When(status_ranking='2', then='pub_date')).asc(),
Case(When(status_ranking='3', then='pub_date')).asc(),
Case(When(status_ranking='4', then='pub_date')).asc()
)
每当我使用这种方法时,都会出现错误;无法将关键字“-pub_date”解析为字段
def get_queryset(self, *args, **kwargs):
return super(PublishedManager, self).get_queryset().filter(
pub_date__lte=timezone.now(), status="published").order_by(
Case(When(status_ranking='1', then='-pub_date')).asc(),
Case(When(status_ranking='2', then='-pub_date')).asc(),
Case(When(status_ranking='3', then='-pub_date')).asc(),
Case(When(status_ranking='4', then='-pub_date')).asc()
)
解决方案
您可以使用.desc()
[Django-doc]而不是.asc()
[Django-doc]以desc结束顺序进行排序。
话虽这么说,你的目标是很难理解的。如果要先按status_ranking
(升序)排序,然后按pub_date
(降序)排序,可以使用:
return super(PublishedManager, self).get_queryset().filter(
pub_date__lte=timezone.now(), status='published'
).order_by('status_ranking', '-pub_date')
或者,如果您只想在状态排名中订购一到四:
return super(PublishedManager, self).get_queryset().filter(
pub_date__lte=timezone.now(), status='published'
).order_by('status_ranking', Case(When(status_ranking__in=[1,2,3,4], then='pub_date')).desc())
推荐阅读
- bash - 具有包含等号的命名参数的 Bash 脚本
- javascript - “ResizeObserver - 超出循环限制” | 从未使用过 API
- php - phpqrcode 和 google 身份验证器 - 不确定事物的格式以及如何使其正确验证
- c++ - c++ 中的 size_t 是什么意思?
- node.js - 如何使用 node.js 向图像服务器发出 post 请求
- r - anytime function (anytime package) to capture days and month correcly
- java - How to disable resizing while allowing maximizing?
- r - Finding index of vector from two other vectors
- java - Android Tabview + Webview
- c# - Difference in behavior between generic and non-generic WeakReference