首页 > 解决方案 > 使用带有条件的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()
                )

标签: pythondjango

解决方案


您可以使用.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())

推荐阅读