簡體   English   中英

django rest 框架中的序列化程序

[英]Serializers in 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"
  }

您最有可能想要做的是將StringRelatedField用於 MovieSerializer 上的流派字段。 例如:

class MovieSerializer(serializers.ModelSerializer):
    genre = serializers.StringRelatedField(many=True)

    class Meta:
        model = Movie
        fields = ('popularity', 'director', 'genre', 'imdb_score', 'name')
        depth = 1

嵌套序列化是處理此問題的最有效方法。 “StringRelatedField”的問題是它是只讀的,它會在發布/更新期間引發“StringRelatedField.to_internal_value() must be implementation”錯誤。 看看我對您的代碼所做的更新:

流派序列化器

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

導航到DRF文檔了解更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM