【问题标题】:Django "LIKE" query for JSONFieldJSONField 的 Django“LIKE”查询
【发布时间】:2018-11-11 16:35:00
【问题描述】:

我已经创建了这样的模型:

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

数据文件的结构如下:

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

如果我们用精确的 data.fields.item 过滤对象,我们可以这样做:

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

如果我们想过滤带有 data.fields.item 但不精确的 data.fields.item.value 的对象,如下所示,我们该怎么做?非常感谢!

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

对于 PostgreSQL 中的原始 sql,也许我们可以这样做:

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

并尝试以下 django 语句,但它不起作用:

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

【问题讨论】:

  • 这是 PostgreSQL 数据库吗?大多数其他数据库系统无法“查看”JSON 对象。
  • 是的,这是一个 PostgreSQL 数据库。
  • 我尝试使用 KeyTextTransform,但它不起作用。我应该怎么做才能修复它?非常感谢。

标签: python django postgresql django-queryset


【解决方案1】:

尝试使用

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

不区分大小写使用iregex

【讨论】:

  • 你打错了,一定是objects。让它按预期工作。
【解决方案2】:

Emm,我尝试使用 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'})

没有原始 sql 有没有人有更好的解决方案?

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2018-10-02
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2016-11-29
    • 2016-05-10
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多