通过 Django 查询存储在 Postgres 的 jsonfield 中的日期时间的日期?
Query date on datetime stored within jsonfield in Postgres through Django?
我有一个 Postgres table,其 jsonb
列包含 ISO 格式的 UTC 时间戳数据,如下所示:
{
"time": "2021-04-13T20:14:56Z"
}
此 table 的 Django 模型如下所示:
class DateModel(models.Model):
values = models.JSONField(default=dict)
我需要在 table 中查询具有特定日期时间戳的所有记录(忽略时间)
我正在寻找类似于以下的解决方案:
DateModel.objects.filter(values__time__date='2021-04-13')
我找到的另一个解决方案是查询日期大于前一天且小于下一天的记录。这行得通,但我正在寻找一种通过单个查询来完成此操作的方法,这样代码会更简洁。
有什么建议吗?
您需要对查询集执行一些注释以提取时间字段并将其转换为日期时间。
首先你需要使用django.contrib.postgres.fields.jsonb.KeyTextTransform
提取时间字符串
from django.contrib.postgres.fields.jsonb import KeyTextTransform
query = DateModel.objects.annotate(time_str=KeyTextTransform('time', 'values'))
然后您需要使用 Cast
将该字符串转换为日期时间
from django.db.models.functions import Cast
from django.db.models import DateTimeField
query = query.annotate(time=Cast('time_str', output_field=DateTimeField()))
然后您可以按该注释进行过滤
query = query.filter(time__date='2021-04-13')
我有一个 Postgres table,其 jsonb
列包含 ISO 格式的 UTC 时间戳数据,如下所示:
{
"time": "2021-04-13T20:14:56Z"
}
此 table 的 Django 模型如下所示:
class DateModel(models.Model):
values = models.JSONField(default=dict)
我需要在 table 中查询具有特定日期时间戳的所有记录(忽略时间)
我正在寻找类似于以下的解决方案:
DateModel.objects.filter(values__time__date='2021-04-13')
我找到的另一个解决方案是查询日期大于前一天且小于下一天的记录。这行得通,但我正在寻找一种通过单个查询来完成此操作的方法,这样代码会更简洁。
有什么建议吗?
您需要对查询集执行一些注释以提取时间字段并将其转换为日期时间。
首先你需要使用django.contrib.postgres.fields.jsonb.KeyTextTransform
from django.contrib.postgres.fields.jsonb import KeyTextTransform
query = DateModel.objects.annotate(time_str=KeyTextTransform('time', 'values'))
然后您需要使用 Cast
from django.db.models.functions import Cast
from django.db.models import DateTimeField
query = query.annotate(time=Cast('time_str', output_field=DateTimeField()))
然后您可以按该注释进行过滤
query = query.filter(time__date='2021-04-13')