Использование аннотированного поля для 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(),
),
)