【问题标题】:Django Queryset - extracting only date from datetime field in query (inside .value() )Django Queryset - 仅从查询中的日期时间字段中提取日期(在 .value() 内)
【发布时间】:2013-08-27 05:06:22
【问题描述】:

我想从 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)

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

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

我希望有一个类似这样的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;

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    至少在 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()))
    

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

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

    【讨论】:

    • 真是太好了!我尝试在没有关键字参数的情况下使用它,这可以通过像 annotate(Min('date')),.. 这样的简单表达式来实现,但是对于这个 Cast,关键字别名是强制性的。
    • 使用 Oracle 我不得不做 from django.db.models.functions import Trunctable.objects.annotate(date_only=Trunc('date', 'day', output_field=DateField()))
    【解决方案2】:

    对于以下情况。

    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;
    

    您可以使用extra 来实现数据库功能。

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

    希望对你有帮助。

    谢谢。

    【讨论】:

    猜你喜欢
    • 2021-01-05
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2019-08-18
    相关资源
    最近更新 更多