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

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

关键修改说明

  1. 移除了提前返回的代码:删除了return super().create(validated_data)这一行,让后续处理嵌套字段的逻辑能够正常执行。
  2. 正确的嵌套对象创建流程:
    • 从验证后的数据中取出tax_information字段的数据
    • 使用TaxInformationSerializer验证并保存税务信息实例
    • 最后创建公司实例时,将已保存的税务信息关联进去

这样修改后,DRF就能正确处理嵌套的可写字段,不会再触发默认的断言错误。

内容的提问来源于stack exchange,提问作者Subhajit Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:05