Я пытаюсь выяснить способ запроса данных внутри postgres JSONField в конкретном экземпляре моей модели.Запросить содержимое JSONField модели Django
Из всего, что я видел, все варианты использования эквивалентны, если у вас есть атрибуты JSONField, а затем выбирая все экземпляры вашей модели, где атрибуты - >> color = 'red' или что-то еще.
Так давайте дадим это более реальный пример, скажем, у нас есть модель Shoe
и имеет цену и количество, и все, как поля, но затем также JSONField под названием versions
, который представляет собой массив объектов, каждый из которых объекты, имеющие вещи, которые делают каждую версию особенной.
Так что, если один экземпляр модели обуви Air Jordans, атрибуты JSONField может выглядеть следующим образом:
[
{
color: black,
edition: limited,
tongueColor: red
},
{
color: black,
edition: standard
},
{
color: gold,
edition: fancy,
bright: very
}
]
Таким образом, есть две вещи, которые мы можем сделать, мы можем:
- Запрос модели для всех туфель, которые имеют доступную версию с цветом: черный (который вернет наши Air Jordans, плюс, возможно, другие туфли), или
- Запросить экземпляр модели для всех объектов внутри версий JSONField, где цвет = черный. Итак, если у нас уже было
Shoe.objects.filter(name='Air Jordans')
или что-то в этом роде, можно было бы применить какой-то метод или что-то в конце, чтобы просто вернуть первые два объекта выше, гдеcolor == black
?
Я могу найти примеры в Интернете, сделав первый, но не второй.
Я мог бы просто принести объект в память и отфильтровать оттуда, но этот JSONField - это то место, где я надеялся хранить очень большие количества произвольных данных, и поэтому возможность запроса без привлечения целого блоба в память довольно важна , Может ли JSONField поддерживать это?
Как вы знаете, мы можем сделать вторую вещь? – valignatev
Я не совсем уверен, но я думаю, что вы можете сделать что-то вроде этого. .filter (versions__contains = {'color': 'black'}) 'или' .filter (versions__contains = [{'color': 'black'} ]) '. В противном случае вам, вероятно, следует создать некоторый пользовательский поиск и использовать 'json_to_recordset()' https://www.postgresql.org/docs/9.5/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE –
@valentjedi - у меня есть не знаю, возможно ли это, очень возможно, что это не так. – cbrainerd