Запрос Джанго Постгрес вложенный Джсонфилд - PullRequest
0 голосов
/ 28 июня 2019
from django.contrib.postgres.fields import JSONField
class Entity(Model):
    lang = CharField()
    data = JSONField()

Как я могу запросить эту модель, чтобы найти все объекты, которые содержат данное значение.JSON может быть вложенным.

Например, если data равно

[
{
   'name': 'Alfred',
   'children': [{'name': 'Bob', 'children':['name': 'Melanie']}] 
},
{
   'name': 'Harry',
   'children': [{'name': 'Helen'}] 
}
]

Тогда я хочу вернуть его, если я ищу Melanie.Может быть любой уровень вложенности.

Из документации Entity.objects.filter(data__values__contains=['Melanie']) не работает.

1 Ответ

0 голосов
/ 29 июня 2019

Один из возможных способов сделать это, используя цикл while для проверки каждого уровня до тех пор, пока не будут найдены дети:

children = 'data__children'
results = {}
while children:
    try:
        # does the children array have anything on this iteration?
        # data__children__exists
        # data__children__data__children__exists
        # and so on

        items = Entity.objects.filter(**{f"{children}__exists": True})
        if not len(items):
             children = None

        # filter for "data__children__name__icontains"
        # "data__children__children__name__icontains"
        # and so on for each loop

        f = {"{children}__name__icontains": "melanie"}

        # add the filtered names
        results.update({children: Entity.objects.filter(*f)})

        children += '__data__children'
        # or possibly "__children" here ???
        # just how arbitrary are the recursion keys?
    except:
        children = None
print(results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...