2017-02-20 17 views
2

我有一個自定義的JSON模型X田間data可能會或可能不會有這些鍵:key1key2key3。 我需要一種方式來篩選所有與key1實例。Django的過濾器,如果在JSON可選鍵存在

我也試着這樣做:

queryset = X.objects.all() 
queryset = queryset.annotate(
has_key1=(
    Case(
     When(~Q(data__key1__in=[None, '']), then=True), 
     default=False, 
     output_field=models.BooleanField()) 
    ) 
) 

queryset.filter(has_key1=True)返回任何竟然有一些記錄與KEY1。

直接過濾器:queryset.filter(data__key1__in=[1])工作正常。 任何人都有解決這個問題的方法嗎?謝謝。

+0

您是否在使用帶'JSONField'類的PosgreSQL?我不認爲你可以使用它來搜索密鑰。 – themanatuf

+0

這是一個自定義的jsonfield,它將python字典序列化爲json字典並返回。 PG是我的db –

+1

其實我錯了。有一個'has_key'方法:https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#std:fieldlookup-hstorefield.has_key – themanatuf

回答

2

可以使用排除所有NULL值和空字符串:

queryset = queryset.exclude(data__key1__isnull=True).exclude(data__key1__exact='') 
1

您可以在JSONField使用has_key。 JSONField和HStoreField共享此查找 - docs

X.objects.filter(data__has_key='key_1') 

這是基於我的項目的例子,我在FilterSet(django_filters.rest_framework),用於has_key上JSONField通過按鍵來實現過濾(如果鍵不存在,則返回0結果):

filters.py:

class XFilter(FilterSet): 
    data_search_by_key = django_filters.CharFilter(method='filter_data_key', 
     help_text='Search by key') 

    def filter_data_key(self, qs, name, value): 
     qs = X.objects.filter(data__has_key=value) 
     return qs