如何使用django ORM仅在postgres中选择日期部分

时间:2016-12-26 01:56:27

标签: python django python-2.7 django-orm

我的后端设置如下

  • Postgres 9.5
  • Python 2.7
  • Django 1.9

我有一个日期时间类型的表,名为createdAt。我想使用Django ORM选择此字段,仅提交createdAt日期部分和组。

例如,此createdAt字段可能会存储2016-12-10 00:00:00+02016-12-11 10:10:05+02016-12-11 17:10:05+0等等。

通过使用Djanggo ORM,输出应为2016-12-102016-12-11。相应的sql应类似于:SELECT date(createdAt) FROM TABLE GROUP BY createdAt

感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试:

  1. 使用__date运算符按DateTimeField过滤日期部分:createAt__date,这类似于__lt__gt
  2. 使用annotate/Func/FcreateAt上创建额外的字段库,仅显示日期部分。
  3. 使用valuesannotateCount / Sum来创建group by查询。
  4. 示例代码

    from django.db import models
    from django.db.models import Func, F, Count
    
    class Post(models.Model):
        name = models.CharField('name', max_length=255)
        createAt = models.DateTimeField('create at', auto_now=True)
    
    Post.objects.filter(createAt__date='2016-12-26')    # filter the date time field for specify date part                         
                .annotate(createAtDate=Func(F('createAt'), function='date'))  # create an extra field, named createAtDate to hold the date part of the createAt field, this is similar to sql statement: date(createAt) 
                .values('createAtDate')  # group by createAtDate                                     
                .annotate(count=Count('id')) # aggregate function, like count(id) in sql statement
    

    输出

    [{'count': 2, 'createAtDate': datetime.date(2016, 12, 26)}]
    

    注意:

    1. 要指定每个方法的功能,我将long语句分解为serval片段,因此在将其粘贴到代码中时需要删除回车符。
    2. 当您在应用程序中启用时区时,例如USE_TZ = True,在比较django中的两个日期时,您需要更加谨慎。如上所述进行查询时,时区就很重要。
    3. 希望它会有所帮助。 :)

答案 1 :(得分:0)

Django提供Manager.raw()来对模型执行原始查询,但原始查询必须包含在您的情况下无用的主键。如果Manager.raw()不够,您可能需要执行不能完全映射到模型的查询,您可以始终直接访问数据库,使用connection完全绕模型层进行路由。 connection对象表示默认的数据库连接。所以你可以执行查询,如。

from django.db import connection
#acquire cursor object by calling connection.cursor()
cursor = connection.cursor()
cursor.execute('SELECT created_at from TABLE_NAME GROUP BY created_at')

执行查询后,您可以遍历游标对象以获取查询结果。