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)

结果

image

两个序列化器(一个负责序列化,一个负责入参数)

负责序列化

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)

结果

image

同一个序列化器(入参与返回结果不一致)

序列化器

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)

结果

image

posted @ 2022-10-06 16:54  Sherwin_szw  阅读(53)  评论(0编辑  收藏  举报