2013-09-30 3 views
0

날짜별로 항목을 그룹화하고 계산해야합니다. 나는 followint와 sqlite가 그것을 가지고 :장고 : 일별 그룹화 및 계산

Books.objects.filter(state="new").extra({"published_at": "date(published_at)"}).values("published_at").annotate(counter=Count("pk")) 

그러나 SQL 문을 사용하여 추가의 사용은() 다른 DBMS에 이식 할 수 없습니다. 예를 들어 위의 코드는 mysql에서 작동하지 않습니다. 어떻게 sqlite, postgresql 및 mysql에 대한 작업 쿼리를 가질 수 있습니까?

+0

어떻게 날짜를 세고 계십니까? 그것은 항상 1이 될 pk로 계산하는 것 같습니다. 또한 왜 당신은 date (published_at) "'가 필요합니다. Django의 Datetime 필드는 이미 datetime 객체를 제공하므로 날짜로 다시 변환 할 필요가 없습니다. – miki725

+0

published_at는 타임 스탬프이므로 일별로 계산해야합니다. – tapioco123

답변

1

extra()를 사용하지 않는 것보다 데이터베이스에 무관 한 쿼리를 원할 경우. 서 Books.objects.filter = (상태 = "새로운") .order_by ('published_at') .values ​​("published_at") .annotate (("published_at__day을"= 카운트 개수))

하루 그룹화에

FieldError: Join on field 'date' not permitted. Did you misspell 'day' for the lookup type?

재 작성 Django annotate groupings by month 않으면 다음 단계 date__day (published_at__day를) 액세스

는 실패합니다.

Book.objects.all().extra(select={'day': 'extract(day from date)'}).values('day').annotate(num=Count('date')).order_by() 

.all()을 .filter (year = some_year)로 바꾸려면 여러 해를 걸쳐야 할 수 있습니다.

Extract은 MySQL과 PostgreSQL에서 작동하는 것으로 확인되었습니다.

+0

죄송합니다. 이것이 잘못되었으므로 올해까지 필터링 할 필요가 없습니다. – tapioco123

+0

내 대답이 업데이트되었습니다. 그러나 나는 무엇을 성취하려고하는지 완전히 이해했는지 아직도 확신 할 수 없다. 제발 좀 더 자세히 설명해주세요. – allcaps

+0

SQLite .extra ({ "published_at": "date (published_at)"})는 무엇을합니까? 문자열을 날짜로 변환 하시겠습니까? – allcaps