15

I have a Django class as follows:

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

When I run the following queryset, I get an error:

>>> 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

How do I adjust my queryset so that I don't get this error? I want to find the instance of MyModel with the latest created_ts. And I want to use the UNIX_TIMESTAMP function to get it.

Saqib Ali
  • 11,931
  • 41
  • 133
  • 272

3 Answers3

10

I'm not running the same Django version, but I think this'll work:

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

Note the latest keyword argument in there. That's the key (I think, again I can't test this).

Exelian
  • 5,749
  • 1
  • 30
  • 49
7

From the django docs:

aggregate() is a terminal clause for a QuerySet that, when invoked, returns a dictionary of name-value pairs

It will automatically provide this value in many generic cases, e.g.

Sum('items') -> sum_items

For your query, it cannot create a default alias, so you must provide one. This is so the query can return a named result for the values produced. All you have to do is give your aggregate a meaningful named alias and all should work fine:

MyModel.objects.all().aggregate(max_created=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
Esteban
  • 2,444
  • 2
  • 19
  • 19
0

just need set name for result variable :

see item in below code

result = MyModel.objects.all().aggregate(item=Max(Func(F('created_ts'), function='UNIX_TIMESTAMP')))
result.get('item')
hn_tired
  • 690
  • 10
  • 21