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视图中的另一个问题是您的方法不允许我再编辑字段,如何使字段可编辑?