[Python] how to apply filters on a posgres JSONField in django rest framework?

Discussão em 'Python' iniciado por Stack, Agosto 24, 2025.

  1. Stack

    Stack Membro Participativo

    I have a model similar to this:

    # segment/models.py
    from django.db import models
    from django.contrib.postgres.fields import JSONField

    class Segment(models.Model):
    name = models.CharField(max_length=100)
    # docs: https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/fields/#jsonfield
    data = JSONField('data', 'data')



    in field data I store JSON data similar to this

    {
    "length": 123.45
    "difficulty": {
    "avg": "easy"
    "max": "advanced"
    }
    }


    I would like to be able to query data as following:

    • api/segments/?data__difficulty__avg=easy

    to filter all records where

    • data.difficulty.avg="easy".

    to do this, I set up the serializer:

    # api/serializers.py
    from rest_framework import serializers

    class SegmentSerializer(serializers.ModelSerializer):
    class Meta:
    model = Segment
    fields = ['id', 'name', 'data']


    and the view looks like this:

    # api/views.py
    from django_filters.rest_framework import DjangoFilterBackend
    from .serializers import SegmentSerializer
    from segment.models import Segment

    class SegmentViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Segment.objects.all()
    serializer_class = SegmentSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['id', 'name', 'data']


    when I call

    • api/segments

    I get the following error

    AssertionError at /api/segments/
    AutoFilterSet resolved field 'data' with 'exact' lookup to an unrecognized field type JSONField. Try adding an override to 'Meta.filter_overrides'. See: https://django-filter.readthedocs.io/en/master/ref/filterset.html#customise-filter-generation-with-filter-overrides

    Request Method: GET
    Request URL: http://localhost:8000/api/segments/
    Django Version: 2.2.7
    Python Executable: /Users/udos/.virtualenvs/ts/bin/python
    Python Version: 3.6.4
    .
    .
    .


    I tried adding data = serializers.JSONField() to the serializer:

    # api/serializers.py
    from rest_framework import serializers

    class SegmentSerializer(serializers.ModelSerializer):
    data = serializers.JSONField()
    class Meta:
    model = Segment
    fields = ['id', 'name', 'data']


    but the error persists. so I'm not applying it correctly :|

    how is this done properly?

    Continue reading...

Compartilhe esta Página