Как отфильтровать 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 по списку и обеспечения охвата всех элементов списка.

Вернуться на верх