需要有关ManyToMany Field的django rest框架序列化程序的帮助。
模型
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)
串行
class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = ('popularity', 'director', 'genre', 'imdb_score', 'name')
depth = 1
查看
class MovieList(APIView):
def get(self, request, format=None):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
return Response(serializer.data)
使用上述序列化程序的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"
}
如何排除id和流派,以便输出如下所示。
{
"99popularity": 83.0,
"director": "Victor Fleming",
"genre": [
"Adventure",
" Family",
" Fantasy",
" Musical"
],
"imdb_score": 8.3,
"name": "The Wizard of Oz"
}
答案 0 :(得分:2)
您最有可能想要使用StringRelatedField作为MovieSerializer上的流派字段。例如:
class MovieSerializer(serializers.ModelSerializer):
genre = serializers.StringRelatedField(many=True)
class Meta:
model = Movie
fields = ('popularity', 'director', 'genre', 'imdb_score', 'name')
depth = 1
答案 1 :(得分:0)
嵌套序列化是处理这个问题的最有效方法。 “StringRelatedField”的问题是它是只读的,它会在发布/更新期间引发“StringRelatedField.to_internal_value() must be implementation”错误。看看我对您的代码所做的更新:
var url_start =
"https://en.wikipedia.org/w/api.php?action=parse&format=json&prop=text&page=";
var url_middle = wiki_link_extract;
var url_end = "&callback=?";
var full_url = url_start + url_middle + url_end;
$.ajax({
type: "GET",
url: full_url,
contentType: "application/json; charset=utf-8",
async: false,
dataType: "json",
success: function (data, textStatus, jqXHR) {
var markup = data.parse.text["*"];
var blurb = $("<div></div>").html(markup);
$(".article-content-main").html($(blurb).find("p"));
},
error: function (errorMessage) {},
});
class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = ('genre')
导航到 DRF 文档了解更多信息: