[英]Serializers in django rest framework
Need help with serializer of django rest framework for ManyToMany Field .需要帮助 ManyToMany Field 的 django rest 框架的序列化程序。
Model模型
class Genre(models.Model):
genre = models.CharField(max_length=255)
def __unicode__(self):
return u'%s' % (self.genre)
class Movie(models.Model):
popularity = models.FloatField()
director = models.CharField(max_length=255)
imdb_score = models.FloatField()
name = models.CharField(max_length=255)
genre = models.ManyToManyField(Genre)
def __unicode__(self):
return u'%s' % (self.name)
Serializer序列化器
class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = ('popularity', 'director', 'genre', 'imdb_score', 'name')
depth = 1
View看法
class MovieList(APIView):
def get(self, request, format=None):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data)
The result of the API using the above serializer is below,使用上述序列化程序的 API 的结果如下,
{
"popularity":83.0,
"director":"Victor Fleming",
"genre":[
{"id":1,"genre":"Adventure"},
{"id":2,"genre":"Family"},
{"id":3,"genre":"Fantasy"},
{"id":4,"genre":"Musical"}
],
"imdb_score":8.3,
"name":"The Wizard of Oz"
}
How can I exclude id and genre so that the output is like shown below.如何排除 id 和流派,以便输出如下所示。
{
"99popularity": 83.0,
"director": "Victor Fleming",
"genre": [
"Adventure",
" Family",
" Fantasy",
" Musical"
],
"imdb_score": 8.3,
"name": "The Wizard of Oz"
}
What you will most likely want to do is use a StringRelatedField for the genre field on your MovieSerializer.您最有可能想要做的是将StringRelatedField用于 MovieSerializer 上的流派字段。 For instance:
例如:
class MovieSerializer(serializers.ModelSerializer):
genre = serializers.StringRelatedField(many=True)
class Meta:
model = Movie
fields = ('popularity', 'director', 'genre', 'imdb_score', 'name')
depth = 1
Nested serializing is the most effective way to handle this problem.嵌套序列化是处理此问题的最有效方法。 The issue with "StringRelatedField" is it's read-only and it will raise "StringRelatedField.to_internal_value() must be implemented" error during post/update.
“StringRelatedField”的问题是它是只读的,它会在发布/更新期间引发“StringRelatedField.to_internal_value() must be implementation”错误。 Take a look to the update that I made on your code:
看看我对您的代码所做的更新:
class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = ('genre')
class MovieSerializer(serializers.ModelSerializer):
genre = GenreSerializer(many=True)
class Meta:
model = Movie
fields = ('popularity', 'director', 'genre', 'imdb_score',
'name')
depth = 1
#Method to manage create/post requests
def create(self, validated_data):
genre_data = validated_data.pop('genre')
movie = MoviewModel.objects.create(**validated_data)
for genre_data in genre_data:
GenreModel.objects.create(movie=movie, **genre_data)
return movie
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.