Использование аннотированного поля для order_by в Django

У меня есть набор запросов, в котором есть аннотированное значение, в котором используются условные выражения:

def with_due_date(self: _QS):
        self.annotate(
            due_date=models.Case(
                *[
                    models.When(
                        FKMODEL__field=field,
                        then=models.F('created_at') - timedelta(days=days)
                    )
                    for field, days in due_date_mapping.items()
                ],
                output_field=models.DateTimeField(),
            ),
        )
        return self

При попытке применить order_by к этому набору запросов по аннотированному значению я получаю ошибку, что поле не может быть разрешено

File "/code/api/nodes.py", line 2577, in add_order_by
    return qs.order_by(
  File "/usr/local/lib/python3.10/site-packages/django/db/models/query.py", line 1295, in order_by
    obj.query.add_ordering(*field_names)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/sql/query.py", line 2167, in add_ordering
    self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
  File "/usr/local/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1677, in names_to_path
    raise FieldError(
graphql.error.located_error.GraphQLLocatedError: Cannot resolve keyword 'due_date' into field. Choices are:

Почему я не могу упорядочить по значению аннотированного поля?

QuerySet являются неизменяемыми, поэтому вы возвращаете только что созданный:

def with_due_date(self: _QS):
    return self.annotate(
        due_date=models.Case(
            *[
                models.When(
                    FKMODEL__field=field,
                    then=models.F('created_at') - timedelta(days=days),
                )
                for field, days in due_date_mapping.items()
            ],
            output_field=models.DateTimeField(),
        ),
    )
Вернуться на верх