Django Queryset - 仅从查询中的datetime字段中提取日期(在.value()内)

Ani*_*war 8 django django-models django-queryset

我想从django查询中提取一些特定的列

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)
Run Code Online (Sandbox Code Playgroud)

这是我目前用于查询的内容

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

我希望有一个类似于此的SQL查询

 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;
Run Code Online (Sandbox Code Playgroud)

Eug*_*mov 17

至少在Django 1.10.5中,你可以使用这样的东西,没有extraRawSQL:

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

对于过滤,您可以使用date查找(https://docs.djangoproject.com/en/1.11/ref/models/querysets/#date):

table.objects.filter(date__date__range=(start, end))
Run Code Online (Sandbox Code Playgroud)


Cra*_*eek 5

对于以下情况.

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;
Run Code Online (Sandbox Code Playgroud)

您可以使用额外的地方来实现数据库功能.

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

希望它会对你有所帮助.

谢谢.

  • 如今,[`.extra` 只能作为最后的手段](https://docs.djangoproject.com/en/1.10/ref/models/querysets/#django.db.models.query.QuerySet.extra) 。还有其他选择吗? (2认同)
  • 我认为他们已经在上面提到的文档中提到了它的等价物,因为他们说你应该使用RawSQL(https://docs.djangoproject.com/en/1.10/ref/models/expressions/#django.db.models.expressions .RawSQL). (2认同)