Как мне написать запрос ORM на Django, который возвращает совпадение, основанное на пересечении списков?

Если у меня есть, например:

from django.contrib.postgres.fields import JSONField

class MyModel(models.Model):
    data = JSONField()

ЗАДАН экземпляр модели obj1, где data == ['apple', 'banana', 'orange']

ЗАДАН экземпляр модели obj2, где data == ['banana', 'orange']

ЗАДАН экземпляр модели obj3, где data == ['apple']

Как я могу написать запрос ORM, который возвращает все экземпляры модели, в которых data содержится хотя бы один элемент из заданного списка, ['apple', 'strawberry']? Он должен возвращать obj1 и obj2, потому что оба этих объекта включают "яблоко", несмотря на то, что аргумент включает "клубнику", которая не представлена ни в одном из объектов.

Вероятно, вы можете использовать __has_any_keys [Django-doc]:

MyModel.objects.filter(data__has_any_keys=['apple', 'strawberry'])

Но в реляционной базе данных, где структура данных фиксирована, вы не должны рассматривать большие двоичные объекты JSON как неатомарные значения [django-антипаттерны]. Раскрытие информации: я являюсь автором этой страницы.

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