如何嵌套具有相同型号的两个序列化程序



我有两个相同型号的序列化程序。我想嵌套它们。

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

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
}
}

使用source=*而不是many=Trueas

class BetterBookSerializer(serializers.ModelSerializer):
book = BookSerializer(source='*')
class Meta:
model = Book
fields = ('id', 'book')

从文档中,

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

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

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='*'选项的答案是一个很好的方法。这样,您可以在创建新对象时轻松使用嵌套序列化程序。

最新更新