Как отфильтровать queryset так, чтобы все элементы списка были сопоставлены (по определенному ключу) в списке dicts JSONfield?
У меня есть jsonfield, который представляет собой массив dicts с одинаковой структурой. Мне нужен фильтр, который проверяет, имеет ли данная запись все значения в списке параметров по определенному ключу, где-то в списке.
(jsonfield) array = [{'dict_field': 1..}, {'dict_field': 2}, {'dict_field': 3}]
filter = [1,2,3]
return queryset.filter('array__dict_field__contains' = filter)
(1 результат)
filter2 = [1,2,4]
return queryset.filter('array__dict_field__contains' = filter2)
(0 результатов; поскольку не удовлетворяет всем фильтрам)
Я использую фильтр __contains
в качестве заполнителя, но, к сожалению, он не содержит - что должно быть? Спасибо
Я попробовал array__dict_field__in
(пример схемы выше), но, похоже, он не работает. Он не выдает ошибку, но не сопоставляет ни одной записи. Запрос PSQL, который он генерирует, выглядит следующим образом:
SELECT * FROM "table" WHERE ("table"."array" -> dict_field) IN (2)
При запуске в PSQL также возникает ошибка; говорится, что столбец role не существует. Я подумал, что это потому, что в столбце role нет кавычек, но я добавил их, и ошибка сохраняется. Возможно, это связано с тем, что мои данные представляют собой массив dicts (в отличие от dict) следующим образом:
[{"role": 2, "years_experience": 3}, {"role": 3, "years_experience": 5}]
Важно, что в моем случае я могу показать запись, только если она удовлетворяет всем критериям фильтра в одном из ключей, я подумал, что __in
здесь не подходит, но я также не уверен насчет __contains
, так как ему нужно проверить роль в различных dicts, а не только в одном.
Я вижу решения здесь и здесь для фильтрации списков массивов по одному значению, я не знаю, как переделать это для фильтрации списка dict по списку и обеспечения охвата всех элементов списка.