2013-08-27 15 views
6

(.value() içinde) sorgusunda datetime alandan sadece tarih ayıklanmasıDjango sorgu kümesi - Django sorgudan bazı belirli sütunları ayıklamak istediğiniz

models.py Bu ben buyum

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) 

Şu anda benim sorguda bu

benzer bir SQL sorgusu sahip umuyorum

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

için kullanmakta

cevap

3

Aşağıdaki örnek için. Eğer DB işlevi uygulayabilir, nerede

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; 

Sen extra kullanabilirsiniz.

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

Size yardımcı olacaktır umarım.

Teşekkürler.

+0

Günümüzde, ['.extra' sadece son çare olarak kullanılmalıdır] (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.query.QuerySet.extra) . Alternatif var mı? – mgalgs

+1

Yukarıda bahsedilen dokümanlarda eşdeğerinden söz ettiklerini düşünüyorum, RawSQL'i kullanmanız gerektiğini söylediler (https://docs.djangoproject.com/en/1.10/ref/models/expressions/#django.db.models. expressions.RawSQL). – CrazyGeek

10

En azından Django 1.10.5 yılında, sen extra ve RawSQL olmadan böyle bir şey, kullanabilirsiniz:

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

Ve filtreleme için, sen date araması (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#date) kullanabilirsiniz:

table.objects.filter(date__date__range=(start, end))