Django "LIKE" запрос для JSONField - PullRequest
0 голосов
/ 11 ноября 2018

Я создал такую ​​модель:

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"}])

Для raw sql в PostgreSQL, возможно, мы можем сделать следующее:

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')

1 Ответ

0 голосов
/ 11 ноября 2018

Эмм, я пробую исходное решение sql с json_array_elements, и оно работает.

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'})

У кого-нибудь есть лучшее решение без raw sql?

...