Django项目AssertionError:已定义create方法仍触发嵌套字段报错
问题分析与解决方案
你的代码之所以报错,是因为CompanySerializer的create()方法中,提前执行了return super().create(validated_data),导致后续处理嵌套字段的代码完全没有被执行。DRF默认的create()方法不支持可写嵌套字段,所以才会触发AssertionError。
修正后的Serializer代码
class TaxInformationSerializer(serializers.ModelSerializer): class Meta: model = TaxInformation fields = '__all__' def create(self, validated_data): return TaxInformation.objects.create(**validated_data) class CompanySerializer(serializers.ModelSerializer): tax_information = TaxInformationSerializer() class Meta: model = Company fields = ["brand_name", "legal_name", "mobile", "telephone_no", "fax", "status", "tax_information"] read_only_fields = ['user', 'created_at'] def create(self, validated_data): # 自动设置当前请求用户 request = self.context.get('request') if request and hasattr(request, 'user'): validated_data['user'] = request.user # 处理嵌套的税务信息 tax_information_data = validated_data.pop('tax_information') tax_information_serializer = TaxInformationSerializer(data=tax_information_data) tax_information_serializer.is_valid(raise_exception=True) tax_information = tax_information_serializer.save() # 创建公司实例并关联税务信息 instance = Company.objects.create(tax_information=tax_information, **validated_data) return instance
关键修改说明
- 移除了提前返回的代码:删除了
return super().create(validated_data)这一行,让后续处理嵌套字段的逻辑能够正常执行。 - 正确的嵌套对象创建流程:
- 从验证后的数据中取出
tax_information字段的数据 - 使用
TaxInformationSerializer验证并保存税务信息实例 - 最后创建公司实例时,将已保存的税务信息关联进去
- 从验证后的数据中取出
这样修改后,DRF就能正确处理嵌套的可写字段,不会再触发默认的断言错误。
内容的提问来源于stack exchange,提问作者Subhajit Das
相关产品推荐
相关产品推荐

