Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-filterdjango-jsonfield

Django FilterSet for JSON fields


For example, I have a simple django-model:

class SimpleModel(models.Model):
    some_attr = models.JSONField() #there is [attr1, attr2, ...] in JSON

Simple view:

class SimpleView(ListCreateApivView):
    filter_backends = [DjangoFilterBackend, ]
    filterset_class = SimpleFilter

And simple filter:

class SimpleFilter(django_filters.FilterSet):
    class Meta:
        model = SimpleModel
        fields = {'some_attr': ['icontains', ]}

I wanna check is the http://127.0.0.1/simple?some_attr__icontains=['Something, that I have in db'] In my db there is JSONField, which contains [a1, a2, a3 ...], so, how can I check is value from url is in db JSONField?


Solution

  • Thanks for answer, I solve the problem with creating custom-filter for my JSON-field, something like that:

    
    class CharInFilter(filters.BaseInFilter, filters.CharFilter):
        pass
    
    class MainInfoFilter(filters.FilterSet):
    
        some_attr = CharInFilter(method='some_attr_filter')
    
        def some_attr_filter(self, queryset, name, value):
            query = Q()
            for type in value:
                query |= Q(license_types__icontains=type)
            if query:
                queryset = queryset.filter(query)
            return queryset