As per the Django JSONField docs, it explains that that the data
structure matches python native format, with a slightly different approach when querying.
If you know the structure of the JSON, you can also filter on keys as if they were related fields:
object.filter(data__animal="cat")
object.filter(data__name="tom")
By array access:
object.filter(data__0__animal="cat")
Your contains example is almost correct, but your data is in a list and requires:
object.filter(data__contains=[{'animal': 'cat'}])