Django queryset, как запросить SQL с положительными значениями во-первых, нулевые значения во-вторых - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть SQL-запрос, подобный следующему:

select * from results_table order by case 
    when place = 0 then 1 else 0 end, place

Этот запрос сначала сортирует положительные числа, затем НУЛИ.Как я могу написать это в Django?А еще лучше, как я могу написать это следующим образом:

Result.objects.filter(...).order_by('positive_place', 'place')

, где для определенных моделей существует «positive_place».Я читаю о аннотации, но пока не уверен, как это работает.Мне нужно написать аннотацию для каждого запроса.Есть ли способ написать аннотацию для каждого набора запросов?

1 Ответ

3 голосов
/ 19 сентября 2019

Аннотация добавляет атрибут к каждому объекту в наборе запросов.Атрибуты могут быть дополнительно отфильтрованы и упорядочены.Вы можете аннотировать набор запросов, используя условные выражения , и вы можете сделать его повторно используемым, вызывая пользовательские методы набора запросов из менеджера моделей .

Мне трудно понятьВаш желаемый заказ, но вот пример того, как его можно собрать.

from django.db import models
from django.db.models import Case, Value as V, When

class ResultQuerySet(models.QuerySet):
    def annotate_positive_place(self):
        return self.annotate(
            positive_place=Case(When(place=0, then=V(1)), default=V(0))
        )

class Result(models.Model):
    place = models.IntegerField()

    objects = ResultQuerySet.as_manager()

Result.objects.annotate_positive_place().order_by('positive_place')
...