gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:40 25 4
gpt4 key购买 nike

我的后端设置如下

  • 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

谢谢。

最佳答案

你可以试试:

  1. 使用 __date 运算符按日期部分的 DateTimeField 过滤:createAt__date,这类似于 __lt__gt
  2. 使用annotate/Func/FcreateAt 的基础上创建一个仅显示日期部分的额外字段。
  3. 使用valuesannotateCount/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 中比较两个日期时需要更加小心。进行上述查询时,时区很重要。

希望对您有所帮助。 :)

关于python - 如何使用 django ORM 在 postgres 中只选择日期部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com