Django中无法从Serializer获取数据的技术咨询(附相关代码)
问题排查与解决
嘿,我一眼就发现问题出在哪儿了——你的BlogSerializer继承错了类!
核心原因
你现在继承的是serializers.Serializer,但却用了Meta类来指定模型和字段——这其实是ModelSerializer的专属用法。普通的Serializer不会读取Meta里的配置,所以你的序列化器实际上没有任何字段定义,自然无法从模型实例中获取数据。
两种修复方案
方案一:改用ModelSerializer(推荐,更简洁)
把BlogSerializer改成继承serializers.ModelSerializer,这样Meta类的配置就会被正确识别,自动生成对应字段:
from rest_framework import serializers from .models import Post class BlogSerializer(serializers.ModelSerializer): # 这里改成ModelSerializer class Meta: model = Post fields = ['author', 'title', 'text', 'published_date']
方案二:如果坚持用Serializer,手动定义所有字段
如果你需要更精细的控制,不想用ModelSerializer,那就得手动给每个字段定义序列化类型,同时实现必要的创建/更新方法:
from rest_framework import serializers from .models import Post from django.contrib.auth import get_user_model User = get_user_model() class BlogSerializer(serializers.Serializer): author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) title = serializers.CharField(max_length=200) text = serializers.CharField() published_date = serializers.DateTimeField(allow_null=True, required=False) def create(self, validated_data): return Post.objects.create(**validated_data) def update(self, instance, validated_data): instance.author = validated_data.get('author', instance.author) instance.title = validated_data.get('title', instance.title) instance.text = validated_data.get('text', instance.text) instance.published_date = validated_data.get('published_date', instance.published_date) instance.save() return instance
注意:用普通
Serializer时,必须手动实现create和update方法,否则POST/PUT请求无法正常保存数据。
验证修复效果
修改完序列化器后,重新启动服务,测试blog_list接口:
- 发送GET请求,应该能正常返回所有Post的序列化数据
- 发送POST请求,传入符合格式的数据,应该能成功创建新的Post并返回数据
内容的提问来源于stack exchange,提问作者bhupesh kandpal
相关产品推荐
相关产品推荐

