How do I write a Django ORM query that returns a match based on an intersection of lists?

If I have, for example:

from django.contrib.postgres.fields import JSONField

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

GIVEN a model instance obj1, where data == ['apple', 'banana', 'orange']

GIVEN a model instance obj2, where data == ['banana', 'orange']

GIVEN a model instance obj3, where data == ['apple']

How can I write an ORM query that returns all model instances whose data includes at least one item from a given list, ['apple', 'strawberry']? It should return obj1 and obj2 because both of those objects include 'apple', despite the argument including 'strawberry', which is not represented in any of the objects.

You can probably use __has_any_keys [Django-doc]:

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

But in a relational database where the structure of the data is fixed, you should not treat JSON blobs as non-atomic values [django-antipatterns]. Disclosure: I am the author of that page.

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