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')

views

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserInfo
        fields = '__all__'

    def validate_depart(self, value):
        """
        depart是外健,value是对象
        """
        if value.id < 2:
            print(value.id)
            return value
        raise exceptions.ValidationError('depart不能大于2')

    def validate_tag(self, value):
        """
        tag是多对多,value是list对象
        """
        return value

class UserView(OrPermissionAPIView):

    def post(self, request, *args, **kwargs):
        """
            {
               "username": "szw2",
                "password": "szw2",
                "depart":1,如果要穿depart_id需要自己在序列化器中定义使用
                "tag":[1,2]
            }
            针对外健,直接传入id,多对多传入list
        """
        json_data = request.data
        ser = UserSerializer(data=json_data)
        if ser.is_valid():
            # 提交数据库时,自动关联外健,创建多对多关系
            ser.save()
            return Response("ok")
        else:
            return Response(ser.errors)
posted @ 2022-10-06 12:51  Sherwin_szw  阅读(210)  评论(0编辑  收藏  举报