如果您还覆盖序列化程序上的创建和更新方法,则可以使用@kahlo 的方法进行 POST 和 PUT 。
给定这样的配置文件模型:
class Profile(models.Model):
user = models.OneToOneField(User)
avatar_url = models.URLField(default='', blank=True) # e.g.
这是一个读取和写入附加配置文件字段的用户序列化程序:
class UserSerializer(serializers.HyperlinkedModelSerializer):
# A field from the user's profile:
avatar_url = serializers.URLField(source='profile.avatar_url', allow_blank=True)
class Meta:
model = User
fields = ('url', 'username', 'avatar_url')
def create(self, validated_data):
profile_data = validated_data.pop('profile', None)
user = super(UserSerializer, self).create(validated_data)
self.update_or_create_profile(user, profile_data)
return user
def update(self, instance, validated_data):
profile_data = validated_data.pop('profile', None)
self.update_or_create_profile(instance, profile_data)
return super(UserSerializer, self).update(instance, validated_data)
def update_or_create_profile(self, user, profile_data):
# This always creates a Profile if the User is missing one;
# change the logic here if that's not right for your app
Profile.objects.update_or_create(user=user, defaults=profile_data)
生成的 API 会根据需要呈现平面用户资源:
GET /users/5/
{
"url": "http://localhost:9090/users/5/",
"username": "test",
"avatar_url": "http://example.com/avatar.jpg"
}
您可以avatar_url
在 POST 和 PUT 请求中包含配置文件的字段。(并且用户资源上的 DELETE 也将删除其 Profile 模型,尽管这只是 Django 的正常删除级联。)
如果用户丢失(在任何更新时) ,此处的逻辑将始终为用户创建一个配置文件模型。对于用户和个人资料,这可能就是您想要的。对于其他关系,它可能不是,您需要更改更新或创建逻辑。(这就是为什么 DRF不会自动为您写入嵌套关系的原因。)