【问题标题】:Integrity error while trying to serialize nested object using django rest framework尝试使用 django rest 框架序列化嵌套对象时出现完整性错误
【发布时间】:2015-06-01 22:38:30
【问题描述】:

模型文件

class Address(models.Model):
    address_id = models.AutoField(primary_key=True, auto_created=True)
    address_data = models.CharField(max_length=250)


class User(models.Model):
    user_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    address = models.ForeignKey(Address)

序列化程序文件

class AddressSerializer(serializers.ModelSerializer):

    class Meta:
        model = Address
        fields = ('address_data')


class UserSerializer(serializers.ModelSerializer):
    address = AddressSerializer()

    class Meta:
        model = User
        fields = ('name', 'address')

    def create(self, validated_data):
        address_data = validated_data.pop('address')
        user = User.objects.create(**validated_data)
        Address.objects.create(user=user, **address_data)
        return user

我在模型和序列化程序文件中有上面的代码sn-p。 我在序列化和保存以下对象时遇到完整性错误。

{"name": "John", "address": {"address_data": "some address"}}

我正在尝试将两个对象保存在具有外键约束的 2 个表中。我觉得它出错的地方是 user = User.objects.create(**validated_data) 因为 address 对象仍未创建,我试图在没有 address 引用的情况下保存 user 对象。

我检查了所有 django-rest-framework documentation。我无法理解我哪里出错了。

【问题讨论】:

  • 我收到以下错误字符串IntegrityError at /api/v1/user/create null value in column "address_id" violates not-null constraint DETAIL: Failing row contains (2, John, null)

标签: python django serialization nested django-rest-framework


【解决方案1】:

在您的 UserSerializer 中,模型是 Address。不应该是用户吗?

编辑

您在 UserSerializer 上的创建方法应该是这样的:

def create(self, validated_data):
        address_data = validated_data.pop('address')
        address = Address.objects.create(**address_data)
        validated_data['address'] = address
        user = User.objects.create(**validated_data)

您的用户拥有指向地址的外键,但您没有将其传递给用户的 create 方法。

【讨论】:

  • 对不起,它只是用户。而不是地址..这是一个错字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2021-06-23
  • 2016-06-25
  • 2018-12-13
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多