Django REST Framework IntegrityError求助:Card_id非空约束违规
解决Django REST Framework中IntegrityError(Card_id为空约束)的问题
嘿,我来帮你搞定这个数据库约束错误!先从错误信息入手——null value in column "Card_id" violates not-null constraint,这说明你创建Integration实例时,Card字段完全没被正确赋值,数据库当然会拒绝这条不符合约束的数据啦。
先揪出代码里的问题
看你的IntegrationSerializer的create方法,有两个明显的bug:
- 你从
validated_data里取的是uraCard,但你的序列化器里定义的关联字段是Card,模型里也是Card = models.ForeignKey(Contain...),键名完全不匹配,等于白取,自然拿不到Card的数据。 - 你尝试用
Contain.objects.create(integration=integration, **card_data)创建Contain,但Contain模型里根本没有integration这个外键字段——是Integration关联Contain,反过来不成立,这逻辑完全搞反了。
分两种场景给你解决方案
场景1:关联已存在的Contain卡片
如果前端是给你传已有的Contain的ID,那直接用主键关联最靠谱,修改序列化器如下:
class IntegrationSerializer(serializers.ModelSerializer): # 用PrimaryKeyRelatedField指定查询集,确保只能关联已存在的Contain/Container Card = serializers.PrimaryKeyRelatedField(queryset=Contain.objects.all()) Box = serializers.PrimaryKeyRelatedField(queryset=Container.objects.all()) class Meta: model = Integration fields = ('id', 'Box', 'Card', "date_integration", "date_desintegration") def create(self, validated_data): # 验证后的数据直接就能用,因为Card和Box都是已存在的实例 return Integration.objects.create(**validated_data)
这种情况下,前端的请求体应该是类似这样的:
{ "Box": 1, // 对应Container的ID "Card": 2, // 对应Contain的ID "date_desintegration": "2024-05-20" }
场景2:创建新Contain卡片同时关联Integration
如果你需要在创建Integration的同时生成新的Contain,那修正create方法的逻辑,还要把字段名改对:
class IntegrationSerializer(serializers.ModelSerializer): Card = ContainSerializer() class Meta: model = Integration fields = ('id', 'Box', 'Card', "date_integration", "date_desintegration") def create(self, validated_data): # 注意这里取的是'Card',和序列化器定义的字段名一致 card_data = validated_data.pop('Card') # 先创建Contain实例 new_card = Contain.objects.create(**card_data) # 把刚创建的Card关联到Integration上 integration = Integration.objects.create(Card=new_card, **validated_data) return integration
这种场景下,前端需要传递完整的Contain数据:
{ "Box": 1, "Card": { "serialNumber": "SN001", "typeCard": 1, "state": 1, // 别忘了Product模型要求的其他字段 }, "date_desintegration": "2024-05-20" }
额外提醒
顺便提一句,你的UraContainerSerializer里写的模型是UraContainer,但你定义的模型是Container,这明显是笔误,赶紧改过来,不然以后还会出其他奇怪的问题!
内容的提问来源于stack exchange,提问作者alpha
相关产品推荐
相关产品推荐

