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
相关产品推荐
相关产品推荐

