老师您好,为什么在django的shell界面中测试时,执行serializer.save()之前需要先执行serializer.validated_data,否则会报错,但是在views.py中,在serializer.save()之前未加上serializer.validated_data,却不会报错?
项目根目录下输入python manage.py shell后,执行如下代码:
# 将 json格式的字节串 转换为字典
from rest_framework.parsers import JSONParser
stream = io.BytesIO(b'{"name":"rose", "age":19, "sex":2}') #这里如果把单引号和双引号交换,执行JSONParser().parse(stream)时会报错rest_framework.exceptions.ParseError: JSON parse error - Expecting property name enclosed in double quotes
# 得到字典数据, {'id': 1,......}
data_dict = JSONParser().parse(stream)
# 将字典数据 反序列化
serializer = StudentSerializer(data=data_dict)
# 必须执行这一步验证, 返回True才可以获取后续的 validated_data数据和执行 save等方法
serializer.is_valid()
# 得到 OrderedDict([('name', 'terry'),......] , 会忽略掉 id 属性
serializer.validated_data
# 保存到数据库中
serializer.save()
django项目的views.py中:
@csrf_exempt
def students(request):
if request.method == 'GET':
student_li = Student.objects.all()
serializer = StudentSerializer(student_li, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = StudentSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)