如何在Django REST Framework中从请求获取POST对象并保存模型
如何用Django REST Framework的APIView接收JSON并保存Student模型
嘿,我来帮你搞定这个需求!首先得修正你现有代码里的几个小问题,然后一步步实现接收客户端JSON数据并保存到模型的逻辑。
第一步:修正Student序列化器
你的序列化器目前有几个问题需要调整:
Student模型本身没有username和password字段,这两个属于关联的User模型,所以需要在序列化器里处理User的创建逻辑create方法里的Student.objects.create写法有误,不需要传self,而且要先从客户端数据创建User对象,再关联到Student
调整后的序列化器代码如下:
from rest_framework import serializers from django.contrib.auth.models import User from users.models import Student class StudentSerializer(serializers.ModelSerializer): # 显式声明User的字段,因为Student关联User username = serializers.CharField(write_only=True) password = serializers.CharField(write_only=True) class Meta: model = Student fields = ('username', 'password', 'grade') def create(self, validated_data): # 先从验证后的数据中取出User相关字段 username = validated_data.pop('username') password = validated_data.pop('password') # 创建User对象(用create_user才能正确加密密码) user = User.objects.create_user(username=username, password=password) # 创建Student对象并关联刚创建的User student = Student.objects.create(user=user, **validated_data) return student
第二步:实现APIView的POST方法
接下来在你的CreateUser视图类里重写post方法,用来接收客户端的POST请求,处理JSON数据,用序列化器验证并保存:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .serializers import StudentSerializer class CreateUser(APIView): def post(self, request): # 把请求数据传入序列化器 serializer = StudentSerializer(data=request.data) # 验证数据是否合法 if serializer.is_valid(): # 保存数据(会自动调用序列化器里的create方法) serializer.save() # 返回成功响应,包含创建后的核心数据 return Response(serializer.data, status=status.HTTP_201_CREATED) # 验证失败返回详细错误信息 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
第三步:配置URL路由
最后别忘了在你的app的urls.py里配置对应的路由,让请求能映射到这个视图:
from django.urls import path from .views import CreateUser urlpatterns = [ path('create-user/', CreateUser.as_view(), name='create-user'), ]
测试验证
现在你可以用Postman、curl这类工具发送POST请求到/create-user/,请求体用JSON格式:
{ "username": "test_student", "password": "test_pass_123", "grade": 10 }
如果数据合法,系统会自动创建对应的User和Student对象,并返回成功响应;如果数据有问题(比如用户名重复、年级不是整数),会返回详细的错误提示。
内容的提问来源于stack exchange,提问作者saleh sereshki
相关产品推荐
相关产品推荐

