django中的序列化器休息框架

时间:2015-08-12 19:21:59

标签: python django django-rest-framework

需要有关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"
  }

2 个答案:

答案 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 文档了解更多信息: