Django 在充当另一个序列化程序类的序列化程序类中指定字段名';s场
假设下面的Django 在充当另一个序列化程序类的序列化程序类中指定字段名';s场,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,假设下面的ModelSerializer类 class UserSongSerializer(serializers.ModelSerializer): user = serializers.SerializerMethodField() song_likes = serializers.ReadOnlyField() # This is model's property field song_shares = serializer
ModelSerializer
类
class UserSongSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
song_likes = serializers.ReadOnlyField() # This is model's property field
song_shares = serializers.ReadOnlyField()
song_plays = serializers.ReadOnlyField()
song_price = serializers.ReadOnlyField()
genre = GenreSerializer(many=True,required=False,context={'key':5})
language = LanguageSerializer(many=True, required=False)
传递特定的context
kwarg,如下所示
genre = GenreSerializer(many=True,required=False,context={'fields':['name']})
由于我想在某些特定情况下只检索Genre
model类中的name字段,因此我重写了GenreSerializer
class的get\u fields\u name
方法,以便我仅在需要时通过上下文提及特定字段
class GenreSerializer(serializers.ModelSerializer):
def get_field_names(self, *args, **kwargs):
"""
Overriding ModelSerializer get_field_names method for getting only specific fields in serializer when mentioned in SerializerClass arguments
"""
field_names = self.context.get('fields', None)
if field_names:
return field_names
return super(GenreSerializer, self).get_field_names(*args, **kwargs)
class Meta:
model = Genre
fields = '__all__'
但是,我无法在重写的get\u fields\u name
方法中获取任何“fields”(获取None
)键。我知道其他方法,比如使用StringRelatedField
,但这会将输出表示形式更改为
"genre":[
"Pop",
"Rock"
]
然而,我想坚持我原来的表述
"genre": [
{
"id": 3,
"name": "Pop",
"created_date": "2018-09-05T17:05:59.705422+05:30",
"updated_date": "2018-09-20T14:43:02.062107+05:30",
"status": false
},
{
"id": 4,
"name": "Rock",
"created_date": "2018-09-05T17:06:06.889047+05:30",
"updated_date": "2018-09-17T16:45:22.684044+05:30",
"status": true
},
{
"id": 5,
"name": "Classical",
"created_date": "2018-09-05T17:06:14.216260+05:30",
"updated_date": "2018-09-05T17:06:14.275082+05:30",
"status": true
}
]
更新-我想要的是这样
"genre": [
{
"name": "Pop"
},
{
"name": "Rock"
},
{
"name": "Classical"
}
]
上下文只能设置为根序列化程序 每当实例化
UserSongSerializer
时,它将覆盖嵌套的类型
上下文
如果您使用的是泛型视图,则需要覆盖视图的get\u serializer\u context
,并在其中添加您自己的上下文。记录在案
PS:上下文被序列化程序、字段和验证器“共享”
PPS:设置后不要更改上下文,这将是一种未定义的行为。谢谢您的简明回答。您是否可以建议解决方案(使用FBV)。我不想手动
pop
UserSongSerializer(…)。数据
我不想要的字段