简体   繁体   English

JSONField 的 Django“LIKE”查询

[英]Django "LIKE" query for JSONField

I have created model like this:我已经创建了这样的模型:

class Customer(models.Model):
   name = models.CharField(max_length=200)
   data = JSONField()

and data filed has this structure:和数据归档具有以下结构:

Customer.objects.create(name='David', data={
    fields: [
        {id: 1, value: "abc"},
        {id: 2, value: "efg}
    ]
})

If we filter objects with exact data.fields.item, we can do like this:如果我们使用精确的 data.fields.item 过滤对象,我们可以这样做:

Customer.obejcts.filter(data__fields__contains=[{id: 1, value: "abc"}])

If we want to filter objects with data.fields.item but with not exact data.fields.item.value as follows, how can we do this?如果我们想过滤带有 data.fields.item 但不准确的 data.fields.item.value 的对象,如下所示,我们该怎么做? Thanks very much!非常感谢!

Customer.obejcts.filter(data__fields__contains=[{id: 1, value: "b"}])

For raw sql in PostgreSQL, maybe we can do as follows:对于PostgreSQL中的raw sql,也许我们可以这样做:

SELECT id, json_string(fields,'value') FROM table_name
    WHERE json_string(fields,'value') LIKE '%b%';

And try the following django statement, but it doesn't work:并尝试以下 django 语句,但它不起作用:

queryset = Customer.objects\
                .annotate(fieldValue=KeyTextTransform('value', 'fields'))\
                .filter(fieldValue__contains='b')

Emm, I try a raw sql solution with json_array_elements and it works.嗯,我尝试了一个带有json_array_elements的原始 sql 解决方案并且它有效。

def search_like(field):
    return Customer.objects.raw("""
        SELECT *
        FROM customer t, json_array_elements(t.fields::json) AS elem 
        WHERE elem->>'id' = '{}' AND elem->>'value' LIKE '%%{}%%'
    """.format(field['id'], field['value']))

search({'id': 1,'value': 'b'})

Does anyone have better solution without raw sql?如果没有原始 sql,有人有更好的解决方案吗?

try to use尝试使用

Customer.objects.filter(data__fields__value__regex ="b", data__fields__id= 1)

for case insensitive use iregex对于不区分大小写的使用iregex

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM