【问题标题】:How to nest two serializers with same model如何嵌套两个具有相同模型的序列化器
【发布时间】:2019-02-04 09:14:54
【问题描述】:

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

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

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

【问题讨论】:

  • does not work - 会发生什么?

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


【解决方案1】:

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

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

【讨论】:

  • 将json数据转换为validation_data怎么样?
  • 你需要转换什么json?你的意思是当你在创作新书的时候?
  • 是的,我需要它双向工作。将模型对象转换为 json 时,以及从 json 中创建新对象时。
【解决方案2】:

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

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

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

From the doc,

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

【讨论】:

  • 这正是我正在寻找的。非常感谢!
  • 简单胜于复杂 ;)
猜你喜欢
  • 2018-07-05
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2021-07-24
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多