2013-08-27 2 views
6

IDjango Queryset - in Abfrage nur Datum von Datetime-Feld Extrahieren (innen .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) 

Dies ist einige bestimmte Spalten aus django Abfrage extrahieren möchten, was ich bin zur Zeit als für meine Abfrage

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

ich hoffe, ich eine SQL-Abfrage zu haben, die auf diese

ähnlich ist

Antwort

3

Für den folgenden Fall.

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; 

Sie können extra verwenden, wo Sie DB-Funktionen implementieren können.

Ich hoffe, es wird Ihnen helfen.

Danke.

+0

Heutzutage sollte [.extra] nur als letztes Mittel verwendet werden (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.query.QuerySet.extra) . Gibt es eine Alternative? – mgalgs

+1

Ich denke, sie haben ihre Entsprechung in den oben genannten Dokumenten erwähnt, Wie sie sagten, sollten Sie RawSQL verwenden (https://docs.djangoproject.com/en/1.10/ref/models/expressions/#django.db.models. expressions.RawSQL). – CrazyGeek

10

Mindestens in Django 1.10.5, können Sie so etwas wie diese, ohne extra und RawSQL:

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

Und zum Filtern können Sie date Lookup (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#date) verwenden:

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