Как получить порядок набора запросов Django модели? - PullRequest
2 голосов
/ 22 января 2020

view_set.get_queryset().query.order_by даст вам кортеж для класса ViewSet в Django REST Framework, но ModelName.objects.get_queryset().query.order_by - это всегда пустой кортеж. Почему это не заселено? Из журналов базы данных видно, что запрос выполняется при запуске ModelName.objects.all(). Я также пытался выполнить реальный запрос, в случае, если порядок заполнен лениво, но даже это не работает:

>>> all = ModelName.objects.all()
>>> for instance in all:
...     True
>>> all.query.order_by
()

1 Ответ

3 голосов
/ 22 января 2020

Этот бит внутренних компонентов компилятора SQL может помочь. Похоже, что информация об упорядочении хранится в нескольких разных местах в зависимости от того, где она определена, чтобы обеспечить переопределение на разных уровнях:

if self.query.extra_order_by:
    ordering = self.query.extra_order_by
elif not self.query.default_ordering:
    ordering = self.query.order_by
elif self.query.order_by:
    ordering = self.query.order_by
elif self.query.get_meta().ordering:
    ordering = self.query.get_meta().ordering
    self._meta_ordering = ordering

query.order_by устанавливается только тогда, когда набор запросов явно упорядочен. Если вы полагаетесь на порядок по умолчанию, определенный для класса модели, он будет сохранен в query.get_meta().ordering.

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