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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:32:48