Django filter JSONField list of dicts

前端 未结 3 1130
盖世英雄少女心
盖世英雄少女心 2020-12-03 21:31

I run Django 1.9 with the new JSONField and have the following Test model :

class Test(TimeStampedModel):
    actions = JSONField()

Let\'s

相关标签:
3条回答
  • 2020-12-03 21:46

    If you wan't to filter your data by one of fields in your array of dicts, you can try this query:

    Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
    

    It will list all Test objects that have at least one object in actions field that contains key fixed_key_1 of value foo2.

    Also it should work for nested lookup, even if you don't know actual indexes:

    Test(actions=[
        {'fixed_key_1': 'foo4', 'fixed_key_3': [
            {'key1': 'foo2'},
        ]}
    }).save()
    
    Test.objects.filter(actions__contains=[{'fixed_key_3': [{'key1': 'foo2'}]}])
    

    In simple words, contains will ignore everything else.

    Unfortunately, if nested element is an object, you must know key name. Lookup by value won't work in that case.

    0 讨论(0)
  • 2020-12-03 21:54

    You should be able to use a __contains lookup for this and pass queried values as list as documented here. The lookup would behave exactly like ArrayField. So, something like this should work:

    Test.objects.filter(actions__contains=[{'fixed_key_1': 'foo2'}])
    
    0 讨论(0)
  • 2020-12-03 22:04

    You can use the django-jsonfield package, I guess it's already the one you are using.

    from jsonfield import JSONField
    class Test(TimeStampedModel):
        actions = JSONField()
    

    So to search to make a search with a specific property, you can just do this:

    def test_filter(**kwargs):
        result = Test.objects.filter(actions__contains=kwargs)
        return result
    

    If you are using PostgreSQL, maybe you can take advantage of PostgreSQL specific model fields.

    PS: If you are dealing with a lot of JSON structure you have maybe to consider using NoSQL Database.

    0 讨论(0)
提交回复
热议问题