Django报错笔记(1)———Cannot assign “‘2‘“: “Cartoons.ctype_id“ must be a “Cartoontype“ instance.

一、错误报告

1、Cannot assign “‘2’”: “Cartoons.ctype_id” must be a “Cartoontype” instance.

遇到类似 ValueError:Cannot assign:A must be a ‘B’ instance.错误时,意思是–无法分配“2”:卡通.ctype_id“”必须是“CartonType”实例。就是说你必须要实例化这个对象才行。

2、

这里是我的序列化器

#动漫序列化器
class CartoonsSerializer(serializers.Serializer):
    ctitle = serializers.CharField(required=True)
    cpub_date = serializers.DateField(required=True)
    cauth = serializers.CharField(required=True)
    cimage = serializers.CharField(required=True)
    ctype_id = serializers.CharField(required=True)

    def validate(self,attrs):
        print(attrs)
        ctitle = Cartoons.objects.filter(ctitle=attrs).first()
        if ctitle:
            raise serializers.ValidationError('名字已经存在')
        return attrs

    def create(self, validated_data):
        cartoons = Cartoons()
        cartoons.ctitle = validated_data.get('ctitle')
        cartoons.cpub_date = validated_data.get('cpub_date')
        cartoons.cauth = validated_data.get('cauth')
        cartoons.cimage = validated_data.get('cimage')
        cartoons.ctype_id = validated_data.get('ctype_id')
        cartoons.save()
        return cartoons

这里是我的views代码

# 添加动漫
class CreateCartoonView(GenericAPIView):
    """
    添加动漫接口
    """
    queryset = Cartoons.objects.all()
    serializer_class = CartoonsSerializer

    # 管理员权限验证(如需测试,请注释下面两行代码)
    # authentication_classes = ManageAuthentication,
    # permission_classes = Managerpermission,
    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            # 保存
            cartoons = serializer.save()
            return Response({
                'code': 1,
                'msg': '添加成功',
                'data': {'cartoons_id': cartoons.id}
            })
        return Response({
            'code': 0,
            'msg': '添加失败',
            'data': {'info': serializer.errors}
        })

models模型

#漫画简介表
class Cartoons(models.Model):
    ctitle = models.CharField(max_length=200)
    cpub_date = models.DateField(blank=True, null=True)
    cauth = models.CharField(max_length=200)
    cimage = models.CharField(max_length=200, blank=True, null=True)
    ctype_id = models.ForeignKey(Cartoontype,models.DO_NOTHING, db_column='tid', blank=True, null=True)

    class Meta:
        # managed = False
        db_table = 'cartooninfo'


#漫画类型表
class Cartoontype(models.Model):
    typeid = models.IntegerField()
    typename = models.CharField(max_length=32)


    class Meta:
        # managed = False
        db_table = 'cartoontype'

3、

由于在模型中ctype_id时绑定的Cartoontype的外键,所以在添加ctype_id时必须先实例化此对象。

有一个简单的方法,直接将序列化器中

cartoons.ctype_id = validated_data.get('ctype_id')

改为:

cartoons.ctype_id_id = validated_data.get('ctype_id')

这其实是一个模型定义时的问题,在模型定义时采用 A_B的命名格式会出现这种错误,系统会认为ctype_id_id这样的才是你真正想引用的id。

希望可以帮助到大家~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值