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

Django API中serializer.data返回空数据的问题排查

Django API序列化器返回空数据问题

问题现象

开发Django API时,创建了名为States的模型,打印序列化器能看到QuerySet包含数据,但serializer.data返回的数据为空。

模型代码

class States(models.Model):
    en_name = models.CharField(max_length=100)
    ar_name = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = "States"

    def __str__(self):
        return self.en_name

序列化器代码

class StatesSerializer(serializers.Serializer):
    class Meta:
        model = States
        fields = ['en_name', 'ar_name']

视图代码

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getStates(request):
    states = States.objects.all()  # 从数据库获取所有州数据
    serializer = StatesSerializer(states, many=True)  # 序列化数据
    print(serializer)  # 打印序列化器内容检查数据
    return Response(serializer.data, status=status.HTTP_200_OK)

打印的serializer内容

StatesSerializer(<QuerySet [<States: Alexandria>, <States: Aswan>, <States: Asyut>, <States: Beheira>, <States: Beni Suef>, <States: Cairo>, <States: Dakahlia>, <States: Damietta>, <States: Faiyum>, <States: Gharbia>, <States: Giza>, <States: Ismailia>, <States: Kafr El Sheikh>, <States: Luxor>, <States: Matruh>, <States: Minya>, <States: Monufia>, <States: New Valley>, <States: North Sinai>, <States: Port Said>, '...(remaining elements truncated)...']>, many=True):

问题原因及解决方法

问题出在序列化器的继承逻辑上:你使用了serializers.Serializer(基础序列化器),却配置了只有ModelSerializer才支持的Meta类(指定model和fields)。基础Serializer不会自动映射模型字段,导致序列化后没有数据输出。

解决方式一:改用ModelSerializer(推荐)

直接继承serializers.ModelSerializer,它会自动根据Meta配置生成对应字段,无需手动定义:

from rest_framework import serializers
from .models import States

class StatesSerializer(serializers.ModelSerializer):
    class Meta:
        model = States
        fields = ['en_name', 'ar_name']

解决方式二:手动定义字段(使用基础Serializer)

如果坚持使用基础Serializer,需要手动声明每个字段,同时按需实现create和update方法(支持增改操作时需要):

from rest_framework import serializers
from .models import States

class StatesSerializer(serializers.Serializer):
    en_name = serializers.CharField(max_length=100)
    ar_name = serializers.CharField(max_length=100)

    def create(self, validated_data):
        return States.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.en_name = validated_data.get('en_name', instance.en_name)
        instance.ar_name = validated_data.get('ar_name', instance.ar_name)
        instance.save()
        return instance

内容的提问来源于stack exchange,提问作者Emad Younan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:44:50