如何嵌套两个具有相同模型的序列化器

时间:2018-08-29 14:25:50

标签: python django python-3.x django-rest-framework

我有两个具有相同型号的序列化器。我要嵌套它们。

不幸的是,这种方法不起作用:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'word_count']


class BetterBookSerializer(serializers.ModelSerializer):
    book = BookSerializer(many=False)

    class Meta:
        model = Book
        fields = ('id', 'book')

预期结果:

{
  "id": 123,
  "book": {
    "name": "book_name",
    "word_count": 123
  }
}

2 个答案:

答案 0 :(得分:3)

使用source=*代替 many=True 作为

class BetterBookSerializer(serializers.ModelSerializer):
    book = BookSerializer(source='*')

    class Meta:
        model = Book
        fields = ('id', 'book')

From the doc

  

source='*' 具有特殊含义,用于表示应将整个对象传递给该字段。这对于创建嵌套表示或对需要访问完整对象才能确定输出表示的字段很有用。

答案 1 :(得分:2)

您可以像这样实现所需的输出:

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'word_count']

class BetterBookSerializer(serializers.ModelSerializer):
    book = serializers.SerializerMethodField(read_only=True)

    class Meta:
         model = Book
         fields = ('id', 'book')

    def get_book(self, obj):
         return BookSerializer(obj).data

小更新: 尽管我解决问题的方法效果很好,但是@JPG中提到source='*'选项的答案是一个不错的选择。这样,您可以在创建新对象时轻松使用嵌套的序列化器。