2013-08-27 11 views
6

chcę wyodrębnić pewne szczególne kolumny z zapytania djangoDjango queryset - wyodrębnianie tylko datę z pola datetime w zapytaniu (wewnątrz .Value())

models.py

class table 
    id = models.IntegerField(primaryKey= True) 
    date = models.DatetimeField() 
    address = models.CharField(max_length=50) 
    city = models.CharField(max_length=20) 
    cityid = models.IntegerField(20) 

To, kim jestem obecnie za pomocą mojego zapytania

obj = table.objects.filter(date__range(start,end)).values('id','date','address','city','date').annotate(count= Count('cityid')).order_by('date','-count') 

mam nadzieję mieć kwerendy SQL, który jest podobny do tego

select DATE(date), id,address,city, COUNT(cityid) as count from table where date between "start" and "end" group by DATE(date), address,id, city order by DATE(date) ASC,count DESC; 

Odpowiedz

3

Dla poniższej skrzynki.

select DATE(date), id,address,city, COUNT(cityid) as count from table where date between "start" and "end" group by DATE(date), address,id, city order by DATE(date) ASC,count DESC; 

Możesz użyć extra, gdzie możesz zaimplementować funkcje DB.

Table.objects.filter(date__range(start,end)).extra(select={'date':'DATE(date)','count':'COUNT(cityid)'}).values('date','id','address_city').order_by('date') 

Mam nadzieję, że ci to pomoże.

Dzięki.

+0

W dzisiejszych czasach [.extra' powinien być używany tylko w ostateczności] (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.query.QuerySet.extra) . Czy jest jakaś alternatywa? – mgalgs

+1

Myślę, że wspomnieli o swoim odpowiedniku w wyżej wymienionych dokumentach, Jak powiedzieli, należy użyć RawSQL (https://docs.djangoproject.com/en/1.10/ref/models/expressions/#django.db.models. wyrażenia.RawSQL). – CrazyGeek

10

Przynajmniej w Django 1.10.5, można użyć coś takiego, bez extra i RawSQL:

from django.db.models.functions import Cast 
from django.db.models.fields import DateField 
table.objects.annotate(date_only=Cast('date', DateField())) 

A do filtrowania, można użyć date odnośnika (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#date):

table.objects.filter(date__date__range=(start, end)) 
Powiązane problemy