You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django REST Framework序列化User模型时遇JSON不可序列化错误

Fixing "is not JSON serializable" Error in Django REST Framework for Custom User Model

Hey there! That JSON serializable error is super common when working with non-standard model fields in DRF—let's break down how to fix it for your User model.

First, the root issue: DRF's default serializers don't know how to handle map_fields.AddressField and gis_models.PointField out of the box, since they're not standard Django model fields. Plus, while ManyToMany fields work with default serializers, we'll make sure they're serialized cleanly too.

Step 1: Handle Geospatial Fields (PointField)

For the maplocation PointField, the easiest way is to use the djangorestframework-gis library, which provides serializers specifically for geospatial data.

First install it:

pip install djangorestframework-gis

Step 2: Create Custom Serializers

Now let's build a serializer that handles all your special fields:

from rest_framework import serializers
from rest_framework_gis.serializers import GeoFeatureModelSerializer
from .models import User, Place

# First, a serializer for your Place model to handle ManyToMany relationships
class PlaceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Place
        fields = ('id', 'name', 'description')  # Add all relevant Place fields here

class UserSerializer(GeoFeatureModelSerializer):
    # Serialize ManyToMany fields with nested Place data (instead of just IDs)
    preferred = PlaceSerializer(many=True, read_only=True)
    disliked = PlaceSerializer(many=True, read_only=True)
    
    # Custom serializer for your AddressField
    location = serializers.SerializerMethodField()
    
    # Let rest_framework_gis handle the PointField (will output GeoJSON)
    maplocation = serializers.PointField()

    def get_location(self, obj):
        # Convert the AddressField to a JSON-serializable format
        # Adjust this based on what your map_fields.AddressField returns—could be a string or structured dict
        return str(obj.location)
        # Example if your AddressField has structured data:
        # return {
        #     "street": obj.location.street,
        #     "city": obj.location.city,
        #     "postal_code": obj.location.postal_code
        # }

    class Meta:
        model = User
        fields = ('id', 'email', 'location', 'preferred', 'disliked', 'maplocation')
        # Tell the Geo serializer which field is the geospatial one
        geo_field = 'maplocation'

What Each Part Does:

  • GeoFeatureModelSerializer: This extends DRF's serializer to properly convert PointField into GeoJSON, which is fully JSON-serializable.
  • PlaceSerializer: Nests the related Place objects in your User response instead of just returning their IDs (you can use PrimaryKeyRelatedField(many=True) if you only want IDs instead).
  • SerializerMethodField for location: Since map_fields.AddressField is a third-party field, we explicitly define how to turn it into something JSON can handle—usually a string or a structured dictionary based on the field's actual data.

Step 3: Use the Serializer in Your View

Make sure your view uses this new serializer:

from rest_framework import viewsets
from .serializers import UserSerializer
from .models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

Alternative: No External Library for PointField

If you don't want to use djangorestframework-gis, you can create a custom field serializer for the PointField:

class CustomPointField(serializers.Field):
    def to_representation(self, value):
        if not value:
            return None
        # Return a simple dict with longitude/latitude
        return {
            "longitude": value.x,
            "latitude": value.y
        }

Then replace serializers.PointField() in UserSerializer with CustomPointField().

That should fix the JSON serialization error—you're just giving DRF clear instructions on how to handle those non-standard fields!

内容的提问来源于stack exchange,提问作者E.Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:43:23