2016-04-03 6 views
0

Я использую PostgreSQL и это новое поле Django 1.9, JSONField. Поэтому я получил следующие данные:Django JSONField фильтрация

id|data 
1 |[{'animal': 'cat', 'name': 'tom'}, {'animal': 'dog', 'name': 'jerry'}, {'animal': 'dog', 'name': 'garfield'}] 

Я пытаюсь выяснить, как фильтровать в этом списке json. Я пробовал что-то вроде: object.filter(data__contains={'animal': 'cat'}, но я знаю, что это не так. Кроме того, я думал в этой величине и процеживают в моем коде:

[x for x in data if x['animal'] == 'cat'] 
+0

Вы прочитали всеобъемлющий документ ion [запрос JSONField] (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#querying-jsonfield)? Что непонятно? –

ответ

4

согласно Джанго JSONField docs, он объясняет, что что data структуры соответствует питону родной формата, с несколько иным подходом при запросе.

Если вы знаете структуру JSON, вы можете также фильтровать по клавишам, как если бы они были связаны поля:

object.filter(data__animal='cat') 
object.filter(data__name='tom') 

По доступа к массиву:

object.filter(data__0__animal='cat') 

Ваш contains пример почти правильно , но данные приведены в списке и нуждаются в следующем:

object.filter(data__contains=[{'animal': 'cat'}]) 
+0

вот и все, спасибо! еще одна вещь, могу ли я фильтровать даты? Вместо «животного» я ​​получил ключ, называемый «start_date», который содержит дату в формате ISO 8601. – ezdookie

+0

. Я не думаю, что вы можете, поскольку они хранятся только в виде строк. Я думаю, вам придется вытащить все даты, а затем сравнить их в python. Если бы это было возможно, вы можете проверить его, выполнив это сравнение: 'data__datetime__lte = other_datetime' или любые другие ярлыки запросов. – Airith

+0

Да, это работает ... но только доступ к массиву элементов 'data__0__datetime__lte = '2015-03-12''. вы имеете в виду любой другой способ поиска во всем списке? Спасибо! – ezdookie

Смежные вопросы