Skip to main content
 首页 » 编程设计

python之如何使用 django ORM 在 postgres 中只选择日期部分

2024年10月17日40shihaiming

我的后端设置如下

  • Postgres 9.5
  • Python 2.7
  • Django 1.9

我有一个日期时间类型的表,名为 createdAt。我想使用 Django ORM 选择只有日期部分的字段,并按 createdAt 归档。

例如,这个createdAt字段可能存储2016-12-10 00:00:00+0、2016-12-11 10:10: 05+0、2016-12-11 17:10:05+0 ...等。

使用Djanggo ORM,输出应该是2016-12-10、2016-12-11。对应的sql应该类似于:SELECT date (createdAt) FROM TABLE GROUP BY createdAt。

谢谢。

请您参考如下方法:

你可以试试:

  1. 使用 __date 运算符按日期部分的 DateTimeField 过滤:createAt__date,这类似于 __lt 或__gt。
  2. 使用annotate/Func/F在 createAt 的基础上创建一个仅显示日期部分的额外字段。
  3. 使用values和annotate,Count/Sum创建group by查询。

示例代码

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. 为了指定每个方法的功能,我将长语句分成若干部分,因此您在将其粘贴到代码中时需要删除回车符。
  2. 当您在应用程序中打开时区时,如 USE_TZ = True,在 django 中比较两个日期时需要更加小心。进行上述查询时,时区很重要。

希望对您有所帮助。 :)