drf 校验与序列化返回
models
class Depart(models.Model):
name = models.CharField(verbose_name='部门名', max_length=32)
class Tag(models.Model):
name = models.CharField(verbose_name='标签名', max_length=32)
class UserInfo(models.Model):
username = models.CharField(verbose_name='用户名', max_length=32)
password = models.CharField(verbose_name='密码', max_length=32)
token = models.CharField(verbose_name='token', max_length=64, null=True, blank=True)
role = models.SmallIntegerField(verbose_name='角色', choices=((1, '经理'), (2, '总监'), (3, '普通'),), default=3)
depart = models.ForeignKey(verbose_name='部门', to='Depart', on_delete=models.CASCADE, default=1)
c_time = models.DateTimeField(verbose_name='创建时间', auto_now=True)
tag = models.ManyToManyField(verbose_name='标签', to='Tag')
同一个序列化器(入参与返回结果一致)
序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = '__all__'
view
class UserView(OrPermissionAPIView):
def get(self, request, *args, **kwargs):
queryset = models.UserInfo.objects.all()
queryset = UserSerializer(instance=queryset, many=True)
return Response(queryset.data)
def post(self, request, *args, **kwargs):
json_data = request.data
ser = UserSerializer(data=json_data)
if ser.is_valid():
instance = ser.save()
return Response(UserSerializer(instance=instance).data)
else:
return Response(ser.errors)
结果
两个序列化器(一个负责序列化,一个负责入参数)
负责序列化
class UserSerializer2(serializers.ModelSerializer):
id = serializers.IntegerField()
class Meta:
model = models.UserInfo
fields = ["id"]
负责入参序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = '__all__'
view
class UserView(OrPermissionAPIView):
def get(self, request, *args, **kwargs):
queryset = models.UserInfo.objects.all()
queryset = UserSerializer(instance=queryset, many=True)
return Response(queryset.data)
def post(self, request, *args, **kwargs):
json_data = request.data
ser = UserSerializer(data=json_data)
if ser.is_valid():
instance = ser.save()
return Response(UserSerializer2(instance=instance).data)
else:
return Response(ser.errors)
结果
同一个序列化器(入参与返回结果不一致)
序列化器
class UserSerializer(serializers.ModelSerializer):
"""
read_only 表示返回结果能看见,不用写在入参里
write_only 表示只需要写在入参里,返回结果不可见
"""
# choice ,获取name
role_text = serializers.CharField(source="get_role_display", read_only=True)
# manytomany自定义钩子获取数据
tag_text = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.UserInfo
fields = '__all__'
extra_kwargs = {
'role': {"write_only": True},
'tag': {"write_only": True},
}
def get_tag_text(self, obj):
res = {}
# 获取所有tag
for i in obj.tag.all():
res.update({i.id: i.name})
return res
view
class UserView(OrPermissionAPIView):
def get(self, request, *args, **kwargs):
queryset = models.UserInfo.objects.all()
queryset = UserSerializer(instance=queryset, many=True)
return Response(queryset.data)
def post(self, request, *args, **kwargs):
json_data = request.data
ser = UserSerializer(data=json_data)
if ser.is_valid():
ser.save()
# 同一个序列化器 不用在UserSerializer(instance=queryset)
return Response(ser.data)
else:
return Response(ser.errors)
结果
本文作者:Sherwin
本文链接:https://www.cnblogs.com/sherwin1995/p/16757990.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步