Django ViewSet perform_create无法识别dfn_id引发非空约束错误
Django ViewSet create时dfn_id非空约束错误排查方案
1. 检查Serializer字段映射
- 确认Serializer类显式包含
dfn_id字段,避免被遗漏:class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = ['id', 'dfn_id', '其他字段'] # 必须列出dfn_id - 如果用
exclude配置,确保没把dfn_id排除在外:exclude = ['不需要的字段'] # 不要包含dfn_id
2. 排查perform_create的重写逻辑
- 如果你重写了
perform_create,检查是否在save()时丢失了dfn_id数据:
错误示例:
正确写法:def perform_create(self, serializer): # 只传了自定义字段,没保留serializer验证后的dfn_id serializer.save(user=self.request.user)def perform_create(self, serializer): # 保留所有验证通过的数据,仅额外添加自定义字段 serializer.save(user=self.request.user) # 或者显式传入dfn_id(如果需要单独处理) # serializer.save(dfn_id=serializer.validated_data['dfn_id'], user=self.request.user)
3. 检查Model字段定义
- 确认Model中的
dfn_id没有设置editable=False,否则Serializer会默认忽略该字段:
错误示例:
正确写法(如果不需要禁止后台编辑):class MyModel(models.Model): dfn_id = models.IntegerField(null=False, blank=False, editable=False)class MyModel(models.Model): dfn_id = models.IntegerField(null=False, blank=False) - 若必须保留
editable=False,需在Serializer中显式定义该字段并关闭只读:class MyModelSerializer(serializers.ModelSerializer): dfn_id = serializers.IntegerField(read_only=False) class Meta: model = MyModel fields = ['id', 'dfn_id', '其他字段']
4. 检查信号(Signal)干扰
- 排查项目中是否有
pre_save/post_save信号,是否在实例创建时意外清空了dfn_id:@receiver(pre_save, sender=MyModel) def mymodel_pre_save(sender, instance, **kwargs): # 检查是否存在类似把dfn_id设为None的代码 # instance.dfn_id = None # 这种代码会导致字段为空
5. 临时调试验证
- 在
perform_create中添加打印,确认数据流转:
若def perform_create(self, serializer): print("验证后的数据:", serializer.validated_data) instance = serializer.save() print("创建后的实例dfn_id:", instance.dfn_id)validated_data中有值但instance.dfn_id为null,重点排查Model或Serializer的字段配置。
内容的提问来源于stack exchange,提问作者omega royal
相关产品推荐
相关产品推荐

