You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:29:51