Django Rest 序列化器:保存外键关系并序列化
DjangoRest serializers: Save Foreignkey relation and serialize
我是 Django rest 和序列化器概念的新手
我有这样的数据库结构
用户1->N地址,
用户 1->N Phone
User
是一个 django.contrib.auth.models.User。 Address
和 Phone
两个模型都包含此字段 user_id = models.ForeignKey(User, on_delete=models.CASCADE)
在我的 UserSerializer 中看起来像这样
class UserSerializer(serializers.ModelSerializer):
address = AddressSerializer(many=False)
phone = PhoneSerializer(many=False)
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address', 'phone')
def create(self, validated_data):
# Save user.
user = User.objects.create(
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
username=validated_data['username'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
# User's address
address_data = validated_data['address']
address_data['user_id'] = user.id
address = Address.objects.create(**address_data)
# User's phone
phone_data = validated_data['phone']
phone_data['user_id'] = user.id
phone = Phone.objects.create(**phone_data)
return user
和 AddressSerializer:
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = (
'user_id', 'address', 'pin_code', 'state', 'city', 'country')
我可以创建 User
但在执行 serializer.data
时出现此错误:
AttributeError: Got AttributeError when attempting to get a value for field `address` on serializer `UserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'address'.
编辑:
我的 create
方法如下所示
def create(self, validated_data):
password = validated_data.pop('password')
validated_data['username'] = validated_data['email']
user = User.objects.create(**validated_data)
user.set_password(password)
user.save()
return user
如果您没有明确指定 related_name
,您的地址和 phone 字段应称为 address_set
和 phone_set
class UserSerializer(serializers.ModelSerializer):
address_set = AddressSerializer(many=False)
phone_set = PhoneSerializer(many=False)
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address_set', 'phone_set'
)
或
class UserSerializer(serializers.ModelSerializer):
address = AddressSerializer(many=False, source='address_set')
phone = PhoneSerializer(many=False, source='phone_set')
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address', 'phone'
)
我是 Django rest 和序列化器概念的新手
我有这样的数据库结构
用户1->N地址, 用户 1->N Phone
User
是一个 django.contrib.auth.models.User。 Address
和 Phone
两个模型都包含此字段 user_id = models.ForeignKey(User, on_delete=models.CASCADE)
在我的 UserSerializer 中看起来像这样
class UserSerializer(serializers.ModelSerializer):
address = AddressSerializer(many=False)
phone = PhoneSerializer(many=False)
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address', 'phone')
def create(self, validated_data):
# Save user.
user = User.objects.create(
first_name=validated_data['first_name'],
last_name=validated_data['last_name'],
username=validated_data['username'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
# User's address
address_data = validated_data['address']
address_data['user_id'] = user.id
address = Address.objects.create(**address_data)
# User's phone
phone_data = validated_data['phone']
phone_data['user_id'] = user.id
phone = Phone.objects.create(**phone_data)
return user
和 AddressSerializer:
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = (
'user_id', 'address', 'pin_code', 'state', 'city', 'country')
我可以创建 User
但在执行 serializer.data
时出现此错误:
AttributeError: Got AttributeError when attempting to get a value for field `address` on serializer `UserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'address'.
编辑:
我的 create
方法如下所示
def create(self, validated_data):
password = validated_data.pop('password')
validated_data['username'] = validated_data['email']
user = User.objects.create(**validated_data)
user.set_password(password)
user.save()
return user
如果您没有明确指定 related_name
,您的地址和 phone 字段应称为 address_set
和 phone_set
class UserSerializer(serializers.ModelSerializer):
address_set = AddressSerializer(many=False)
phone_set = PhoneSerializer(many=False)
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address_set', 'phone_set'
)
或
class UserSerializer(serializers.ModelSerializer):
address = AddressSerializer(many=False, source='address_set')
phone = PhoneSerializer(many=False, source='phone_set')
class Meta:
model = User
fields = (
'id', 'username',
'first_name', 'last_name',
'email', 'password',
'address', 'phone'
)