我有两个具有相同型号的序列化器。我要嵌套它们。
不幸的是,这种方法不起作用:
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
}
}
答案 0 :(得分:3)
使用source=*
代替 many=True
作为
class BetterBookSerializer(serializers.ModelSerializer):
book = BookSerializer(source='*')
class Meta:
model = Book
fields = ('id', 'book')
值
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='*'
选项的答案是一个不错的选择。这样,您可以在创建新对象时轻松使用嵌套的序列化器。