2014-02-17 59 views
9

使用Django DateQuerySet我從Group查詢中抽取item對象的相關年份。在Django中按月份/年份註釋(組)日期

>>> Group.objects.all().dates('item__date', 'year') 
[datetime.date(1990, 1, 1), datetime.date(1991, 1, 1), ...(remaining elements truncated)...'] 

現在我想通過不同年份對這些日期進行計數。我認爲這將工作:

>>> Group.objects.all().dates('item__date', 'year').annotate(Count('year')) 
FieldError: Cannot resolve keyword 'year' into field. 

但看起來像我失去了一些東西。我該如何解決這個問題?

我也試過這個查詢:

>>> (Group 
    .objects 
    .all() 
    .extra(select= 
     {'year': 
      connections[Group.objects.db].ops.date_trunc_sql('year', 'app_item.date')})) 
ProgrammingError: missing FROM-clause entry for table "app_item" LINE 1: SELECT (DATE_TRUNC('year', app_item.date)) AS... 

但是,這並不工作。

+0

可能重複[Django:按日期(日,月,年)](http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year) – tback

回答

8

試試沿着這些線路:

from django.db.models import Count 

Item.objects.all().\ 
     extra(select={'year': "EXTRACT(year FROM date)"}).\ 
     values('year').\ 
     annotate(count_items=Count('date')) 

你可能想使用item_instance._meta.fields而不是在MySQL的聲明有手動指定「日期」 ...

另外請注意,我開始Item QuerySet而不是Group,爲了簡單起見。應該可以過濾Item QuerySet以獲得所需的結果,或者使MySQL的extra更復雜。

編輯:

這可能會實現,但依靠它:)

Group.objects.all().\ 
    values('item__date').\ 
    extra(select={'year': "EXTRACT(year FROM date)"}).\ 
    values('year').\ 
    annotate(count=Count('item__date')) 
+0

那麼, 'Group'查詢是什麼讓這個有趣。我已經在做其他相關的東西了,所以我不能從「Item」開始。 –

+0

@YuvalAdam查看編輯 – frnhr

+0

同樣的錯誤「缺少表格的FROM-clause條目...」 –

15

對於任何人的Django 1.9後,發現這個現在有之前我肯定會試膽量出來的TruncDate(TruncMonth,TruncYear)將執行此操作。

from django.db.models.functions import TruncDate 

(Group.objects.all().annotate(date=TruncDate('your_date_attr') 
        .values('date') 
        .annotate(Count('items')) 

希望它有幫助。

+0

中提交有趣的新功能,謝謝! –

+3

@mycroft從我所看到的情況來看,這確實是添加在1.10 –

+0

- 謝謝@IanClark https://docs.djangoproject。COM/EN/1.10/REF /模型/數據庫的函數/#模塊django.db.models.functions.datetime – ptim