尝试使用 django rest 框架序列化嵌套对象时出现完整性错误
Integrity error while trying to serialize nested object using django rest framework
模型文件
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
我在模型和序列化程序文件中有上面的代码片段。
我在序列化和保存以下对象时遇到完整性错误。
{"name": "John", "address": {"address_data": "some address"}}
我正在尝试使用外键约束将两个对象保存在 2 个表中。我觉得它出错的地方是
user = User.objects.create(**validated_data)
因为 address
对象仍未创建,我试图在没有 address
引用的情况下保存 user
对象。
我检查了所有的 django-rest-framework documentation。我无法理解我哪里出错了。
在您的 UserSerializer 中,模型是地址。不应该是用户吗?
编辑
您在 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)
您的用户有指向地址的外键,但您没有将其传递给用户的创建方法。
模型文件
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
我在模型和序列化程序文件中有上面的代码片段。 我在序列化和保存以下对象时遇到完整性错误。
{"name": "John", "address": {"address_data": "some address"}}
我正在尝试使用外键约束将两个对象保存在 2 个表中。我觉得它出错的地方是
user = User.objects.create(**validated_data)
因为 address
对象仍未创建,我试图在没有 address
引用的情况下保存 user
对象。
我检查了所有的 django-rest-framework documentation。我无法理解我哪里出错了。
在您的 UserSerializer 中,模型是地址。不应该是用户吗?
编辑
您在 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)
您的用户有指向地址的外键,但您没有将其传递给用户的创建方法。