首页 > 解决方案 > 如何使用嵌套序列化来序列化和反序列化数据?django-rest-framework

问题描述

我有以下序列化程序:

class UserSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username', 'password')


class ProfileSerializer(ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Profile
        fields = ('id', 'user', 'name', 'address')

当我想创建个人资料时,我应该发送以下数据:

{
    "user":{
        "username": "test_username",
        "password": "123456789"
    },
    "name": "David",
    "address": "Baker St"
}

我的问题是,"user": 5在 POST 请求的情况下是否可以只发送而不是发送字典?

标签: djangodjango-rest-framework

解决方案


您有两个选择,您可以使用两个不同的序列化程序来检索和创建这样的

class ProfileCreateSerializer(ModelSerializer):
    class Meta:
        model = Profile
        fields = ('id', 'user', 'name', 'address')

class ProfileRetrieveSerializer(ProfileCreateSerializer):
    user = UserSerializer()

并决定在视图中使用哪个序列化程序(提示:覆盖get_serializer_class方法)

或者

使用一个序列化器并根据操作类型决定字段类型:

class ProfileCreateSerializer(ModelSerializer):
    class Meta:
        model = Profile
        fields = ('id', 'user', 'name', 'address')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.context['request'].method == 'GET': # or whatever condition you want to use
            self.fields['user'] = UserSerializer()

推荐阅读