Python 根据字段值更改嵌套序列化程序

Python 根据字段值更改嵌套序列化程序,python,django,django-rest-framework,Python,Django,Django Rest Framework,我目前正在尝试将以下序列化程序实现到概要文件序列化程序。但我想补充一个条件。 配置文件序列化程序 class UserProfileSerializer(serializers.ModelSerializer): role = serializers.ChoiceField(choices=(('Reader', u'Reader'), ('Author', u'Author'), ('Admin', u'Admin'))) role_display = serializers.

我目前正在尝试将以下序列化程序实现到概要文件序列化程序。但我想补充一个条件。 配置文件序列化程序

class UserProfileSerializer(serializers.ModelSerializer):
    role = serializers.ChoiceField(choices=(('Reader', u'Reader'), ('Author', u'Author'), ('Admin', u'Admin')))
    role_display = serializers.SerializerMethodField()
    class Meta:
        model = Profile
        fields = ('gender', 'birthday', 'icon', 'role', 'role_display')
        depth = 1
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class ReaderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reader
        fields = '__all__'
作者序列化程序

class UserProfileSerializer(serializers.ModelSerializer):
    role = serializers.ChoiceField(choices=(('Reader', u'Reader'), ('Author', u'Author'), ('Admin', u'Admin')))
    role_display = serializers.SerializerMethodField()
    class Meta:
        model = Profile
        fields = ('gender', 'birthday', 'icon', 'role', 'role_display')
        depth = 1
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class ReaderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reader
        fields = '__all__'
读取器序列化程序

class UserProfileSerializer(serializers.ModelSerializer):
    role = serializers.ChoiceField(choices=(('Reader', u'Reader'), ('Author', u'Author'), ('Admin', u'Admin')))
    role_display = serializers.SerializerMethodField()
    class Meta:
        model = Profile
        fields = ('gender', 'birthday', 'icon', 'role', 'role_display')
        depth = 1
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class ReaderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reader
        fields = '__all__'
author表和reader表对profile表都有一对一的关系。 根据角色选项,我想显示一个特定的嵌套序列化程序

例如:

{
    "id": 19,
    "username": "maoji1",
    "password": "pbkdf2_sha256$180000$YhzDiqzJ4OyC$syzkwR5X3/H2p5NTB0JEK2zS5nvYu5ddHrTgy3cYU/E=",
    "email": "pbkdf2_sha256$180000$YhzDiqzJ4OyC$syzkwR5X3/H2p5NTB0JEK2zS5nvYu5ddHrTgy3cYU/E=",
    "profile": {
        "gender": "male",
        "birthday": "2020-03-10",
        "icon": null,
        "role": {
            is_vip:True,
            validate_date:...
      }
    }
}
读者模型

class Reader(models.Model):
    user = models.OneToOneField(Profile, on_delete=models.CASCADE, related_name='reader', verbose_name='user')
    is_user_vip = models.CharField(choices=(('normal', u'Normal'), ('vip', u'VIP')),
                                   default='normal',
                                   max_length=10,
                                   verbose_name=u'Vip status')
    vip_validate = models.DateField(verbose_name=u"Validate Until",
                                    auto_now_add=True, null=True,
                                    editable=False)
作者模型

class Author(models.Model):
    user = models.OneToOneField(Profile, on_delete=models.CASCADE, related_name='author')
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='Book', null=True)
    contract_number = models.IntegerField(verbose_name='Contact number', null=True, blank=True)
剖面模型

class Profile(models.Model):
    role_choice = (
        ('Reader', u'Reader'),
        ('Author', u'Author'),
        ('Editor', u'Editor'),
        ('Admin', u'Admin')
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile', verbose_name='user')
    gender = models.CharField(choices=(("male", u"Male"), ("female", u"Female")),
                              default="Female",
                              max_length=150, verbose_name='Gender')
    birthday = models.DateField(null=True, blank=True, verbose_name="Birthday")
    icon = models.ImageField(upload_to="media/image/%Y/%m",
                             default=u"media/image/default.png",
                             max_length=1000,
                             verbose_name=u"User icon", null=True)
    role = models.CharField(choices=role_choice,
                            max_length=150,
                            default='Admin',
                            verbose_name='Role')

您可以使用SerializerMethodField并决定必须在其方法中使用哪个序列化程序:

class UserSerializer(serializers.ModelSerializer):
    profile = serializers.MethodField()
    class Meta:
        model = Profile
        fields = ('id', 'username', 'password', 'email','profile')

    def get_profile(self,obj):
         return ProfileSerializer(obj.profile).data


class AuthorSerializer(serializers.ModelSerializer):
     class Meta:
         model = Author
         fields ='__all__' 


 class ReaderSerializer(serializers.ModelSerializer):
     class Meta:
         model = Reader
         fields ='__all__'  




class ProfileSerializer(serializers.ModelSerializer):
    role = serializers.MethodField()
    class Meta:
        model = Profile
        fields = ('gender', 'birthday', 'icon', 'role')

    def get_role(self,obj):
        if hasattr(obj, 'author')
            serializer = AuthorSerializer(obj.author)
            return serializer.data
        elif hasattr(self,'reader'):
            serializer = ReaderSerializer(obj.reader)
            return serializer.data
        return {} # if your profile doesn't have any relation with author or reader



 class UserSerializer(serializers.ModelSerializer):
    profile = serializers.MethodField()
    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email','profile')

    def get_profile(self,obj):
         return ProfileSerializer(obj.profile).data

你能展示你的模型吗?@kamilyrb刚刚用我的模型更新了问题你想根据用户角色更改“角色”键的值对吗?是的,角色字段当前链接到一个选项,我有两个身份,读者和作者。我希望序列化程序显示特定的标识序列化程序,具体取决于roleThanks a lot@kamilyrbSorry来标记您,API视图中的另一个问题是您的方法不允许我再编辑字段,如何使字段可编辑?