gpt4 book ai didi

Django JsonField 按两个字段过滤

转载 作者:行者123 更新时间:2023-12-04 15:01:39 27 4
gpt4 key购买 nike

class Blog:
values = JSONField(blank=True, default=list)
[
{
"id": 1,
"value": "31"
},
{
"id": 2,
"value": "Hello"
},
...
]

我需要获取 ID 为 1 且该字段的值大于 31 的所有对象。我试过 q = queryset.filter(values__0__id=1, values__0__value_gte=31) 但它仅适用于对象,如果我需要的对象仅位于第一个元素中。

最佳答案

显然,现在 Django 没有内置支持 JSONField 的数组元素比较。幸运的是,Django 允许制作很多自定义员工。例如,Djangoraw SQL功能。

如果你使用 PostgreSQL 作为你的主数据库,你可以使用 JSON Processing Functions . JSON 处理函数中的 jsonb_array_elements() 是一个不错的选择。

结合上述功能,我们可以为您的情况做一些解决方法:

# Create method that uses raw SQL within your `objects` Model Manager.
# Create your own filters as you want. This example should be improved
# and handle exception cases of course.
def filter_blogs_json(json_field, sql_operator, value):
return Blog.objects.raw(f"SELECT id, data FROM yourappname_blog CROSS JOIN jsonb_array_elements(values) AS data WHERE (data->'{json_field}')::numeric {sql_operator} {value};")

# You can get raw objects queryset
raw_blogs_qs = filter_blogs_json('value', '>=', 31)

# Then you can process it anyway you want
filtered_blog_ids = [b.id for b in raw_blogs_qs]
queryset = Blog.objects.filter(...).filter(id__in=filtered_blog_ids)

很简单,不是吗? :)

此外,我相信可以制作自己的查询集 Lookup用于 JSONField,根据需要扩展查询等。

关于Django JsonField 按两个字段过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66854287/

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