如果 我需要在序列化器 拿到数据的时候做保存(就行 forms 一样),可以在我们
创建好的 serializer 中重写 create 方法
from rest_framework import serializers
class ReatappSerializer(serializers.Serializer):
name = serializers.CharField(required=True, max_length=100)
click_num = serializers.IntegerField(default=0)
# validated_data 会获取所有提交的字段
def create(self, validated_data):
# create(**validated_data) 方法会把提交的字段保存起来
return Snippet.objects.create(**validated_data)
把用户提交过来的数据保存起来 (这里的流程和逻辑跟 forms 一样):
from .serializers import SnippetSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
class SnippetListView(APIView):
def post(self, request, format=None):
serializer = SnippetSerializer(data=request.data)
# 如果数据验证成功
if serializer.is_valid():
# 保存数据,当调用 save 方法时,序列化器就会执行他的 create 方法。
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
也可以使用 ModelSerializer 对数据进行序列化, 这样代码更加精简
from rest_framework import serializers
class ReatappSerializer2(serializers.ModelSerializer):
class Meta:
model = Snippet # 对应我们 model 中的表
# fields = ('name','click_num',) # 对指定字段进行序列化
fields = "__all__" # 对所有字段进行序列化
此时父级保存的只是一个 id ,json 还没有嵌套,我要将所有数据都序列化 ,
将这个 id 对应的数据也显示进来,就可以进行序列化器的嵌套,
也就是在序列化器里面对父级 id 这个字段进行覆盖,把他换成一个序列化器的实例)
class CategorySerializer2(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = "__all__"
class ReatappSerializer2(serializers.ModelSerializer):
Category = CategorySerializer2()
class Meta:
model = Snippet
fields = "__all__"
此时就能看到级联关系