2013-08-27 34 views
6

tôi muốn trích xuất một số cột cụ thể từ truy vấn djangoDjango QuerySet - giải nén chỉ ngày từ lĩnh vực datetime trong truy vấn (bên .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) 

Đây là những gì tôi hiện đang sử dụng cho truy vấn của tôi

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

tôi hy vọng sẽ có một truy vấn SQL đó là tương tự như sau

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; 

Trả lời

3

Đối với trường hợp dưới đây.

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; 

Bạn có thể sử dụng extra nơi bạn có thể triển khai chức năng DB.

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

Hy vọng nó sẽ giúp bạn.

Cảm ơn.

+0

Ngày nay, ['.extra' chỉ nên được sử dụng như một phương sách cuối cùng] (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.query.QuerySet.extra) . Có cách nào khác không? – mgalgs

+1

Tôi nghĩ rằng họ đã đề cập tương đương của nó trên trong các tài liệu được đề cập ở trên, Như họ nói bạn nên sử dụng RawSQL (https://docs.djangoproject.com/en/1.10/ref/models/expressions/#django.db.models. expressions.RawSQL). – CrazyGeek

10

Ít nhất trong Django 1.10.5, bạn có thể sử dụng một cái gì đó như thế này, mà không extraRawSQL:

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

Và để lọc, bạn có thể sử dụng date tra cứu (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#date):

table.objects.filter(date__date__range=(start, end)) 
Các vấn đề liên quan