我已经创建了这样的模型:
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')
答案 0 :(得分:0)
嗯,我尝试使用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的人,有没有更好的解决方案?
答案 1 :(得分:0)
尝试使用
Customer.objects.filter(data__fields__value__regex ="b", data__fields__id= 1)
不区分大小写使用iregex