一、错误报告
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。
希望可以帮助到大家~