Python
Django

【Django】JSONFieldを持つModelでJSONの中身によってフィルターをかけてデータを取得する

こういうモデルがあって

models.py
class Test(models.Model):
    text = CharField(max_length=255 blank=True, null=True)
    fields = JSONField(blank=True, null=True)

JSONの中身はこのような場合の話

[
    {
        "name": "sample1",
        "value": "value1"
    },
    {
        "name": "sample2",
        "value": True
    },
    {
        "name": "sample3",
        "value": "value3",
        "url": "https://hogehoge.com"
]

例えば、fieldのJSONで"name": "sample2"で"value"がTrueのものをとりたいなー、という場合はこんな感じでフィルターかけたらうまくいった

query = Test.Objects.filter(fields__contains=[{'name': 'sample2', 'value': True}])


JSONが以下のようにネストしている場合

[
    {
        "name": "sample1",
        "value": {
            "foo1": "bar1",
            "foo2": "bar2",
        }
    },
    {
        "name": "sample2",
        "value": {
            "foo1": "bar1",
            "foo4": "bar4",
        }
    }
]

"name"が"sample2"で"value"の中の"foo4"が"bar4"のものだけを取りたいなー、というときは以下のようにフィルターかける

query = Test.Objects.filter(fields__contains=[{'name': 'sample2', 'value': {'foo4': 'bar4'}}]) 

"value"の中の"foo1"が"bar1"だけを取りたい場合は

query = Test.Objects.filter(fields__contains=[{'value': {'foo1': 'bar1'}}])


割とそのまんまだな、と書いてて思った