Странный бобер при использовании order_by с условиями Не удается разрешить ключевое слово '-pub_date в поле - PullRequest
2 голосов
/ 18 февраля 2020

Этот код работает нормально, но это не тот результат, который я хочу. Для каждого случая его порядок переходит от старого к новому

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()
                )

1 Ответ

1 голос
/ 18 февраля 2020

Вы можете использовать .desc() [Django -doc] вместо .asc() [Django -doc ] для заказа в des c конечного порядка.

Как говорится, это весьма нечитабельно , что вы хотите сделать. Если вы сначала хотите отсортировать по status_ranking (в порядке возрастания), а затем по pub_date (в порядке убывания), вы можете использовать:

return super(PublishedManager, self).get_queryset().filter(
    pub_date__lte=timezone.now(), status='published'
).order_by(<b>'status_ranking', '-pub_date'</b>)

или если вы хотите заказать только в статус рейтинга от одного до четырех:

return super(PublishedManager, self).get_queryset().filter(
    pub_date__lte=timezone.now(), status='published'
).order_by('status_ranking', <b>Case(When(<b>status_ranking__in=[1,2,3,4]</b>, then='pub_date')).desc()</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...