Reputation: 2829
I'm trying to query an element within a list of dicts in a Django JSONField. I can find similar questions to mine but not one that covers what I'm trying to do. It seems like it should be simple and fairly common so I suspect I'm missing something simple.
So. to expand slightly on the example in the Django docs
Let's say I have a Dog model with a JSONField named data
and it has some data like so:
Dog.objects.create(name='Rufus',
data = {"other_pets":
[{"name", "Fishy"},
{"name": "Rover"},
{"name": "Dave"}]}
)
There's a key named "other_pets"
which is a list of dicts. I would like to write a query which returns any models which includes a dict with the key name=="Dave"
I am able to directly do this if I refer to the element by the index, eg:
Dog.objects.filter(data__other_pets__2="Dave")
Would return me the row, but I need to reference the index of the list element, and both the position of the item I'm looking up, and the size of the list vary among models.
I thought that maybe:
Dog.objects.filter(data__other_pets__contains={"name":"Dave"})
Would work but this returns no elements.
Is what I'm trying to do possible? As an aside, is it possible to add an index for queries like this?
Thanks!
Upvotes: 1
Views: 735
Reputation: 32244
Since other_pets
is a list, you should pass a list to the contains
filter
Dog.objects.filter(data__other_pets__contains=[{"name":"Dave"}])
Upvotes: 3