Почему Django Queryset говорит: TypeError: для сложных агрегатов требуется псевдоним?

У меня есть класс Django следующим образом:

class MyModel(models.Model):
    my_int = models.IntegerField(null=True, blank=True,)
    created_ts = models.DateTimeField(default=datetime.utcnow, editable=False)

Когда я запускаю следующий набор запросов, я получаю сообщение об ошибке:

>>> from django.db.models import Max, F, Func
>>> MyModel.objects.all().aggregate(Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "MyVirtualEnv/lib/python2.7/site-packages/django/db/models/query.py", line 297, in aggregate
    raise TypeError("Complex aggregates require an alias")
TypeError: Complex aggregates require an alias

Как мне настроить мой запрос, чтобы я не получил эту ошибку? Я хочу найти экземпляр MyModel с последними created_ts. И я хочу использовать функцию UNIX_TIMESTAMP для ее получения.

Ответ 1

Я не использую ту же версию Django, но думаю, что это сработает:

MyModel.objects.all().aggregate(latest=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))

Обратите внимание на аргумент ключевого слова latest. Это ключ (я думаю, опять я не могу это проверить).

Ответ 2

Из django docs:

aggregate() - это предложение терминала для QuerySet, которое при вызове, возвращает словарь пар имя-значение

Он автоматически предоставит это значение во многих общих случаях, например.

Sum('items') -> sum_items

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

MyModel.objects.all().aggregate(max_created=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))