2015-08-31 18 views
11

Mam klasy Django następująco:Dlaczego Derype Queryset mówi: TypeError: Complex aggregates wymaga aliasu?

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

Kiedy uruchomić następującą queryset, otrzymuję błąd:

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

Jak mogę dostosować mój queryset tak, że ja nie rozumiem tego błąd? Chcę znaleźć wystąpienie MyModel z najnowszymi created_ts. I chcę użyć funkcji UNIX_TIMESTAMP, aby ją pobrać.

Odpowiedz

4

Nie uciekam z tej samej wersji Django, ale myślę, że to będzie działać:

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

Uwaga argument latest słów kluczowych tam. To jest klucz (myślę, że znowu nie mogę tego przetestować).

2

From the django docs:

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

Będzie on automatycznie dostarczyć tę wartość w wielu przypadkach, np generycznych

Sum('items') -> sum_items 

Dla zapytania nie można utworzyć domyślnego aliasu, więc należy go podać. Jest tak, że zapytanie może zwrócić nazwany wynik dla wygenerowanych wartości. Wszystko, co musisz zrobić, to nadać swojemu agregatowi znaczący nazwany alias i wszystko powinno działać poprawnie:

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