【问题标题】:Querying objects from 1:M related Models DRF从 1:M 相关 Models DRF 中查询对象
【发布时间】:2019-06-18 01:14:36
【问题描述】:

设计了一个具有多级 1:M 关系的 Django 模型,能够在 DRF 中获取写入序列化器的 json 响应。执行 CRUD 操作看起来很容易,但只针对该表,我期待响应类似于下面的响应,然后遇到了一个名为 Nested Serializers 的术语,因为我不太了解这一点,有人可以建议我为以下型号买一个吗

{
  "Blocks": [
    {
      "id": 1,
      "name": "A",
      "Floor": [
        {
          "id": 1,
          "name": 0,
          "count":2,
          "books": [
            {
              "id": 1,
              "name": "White Tiger"
            },
            {
              "id": 1,
              "name": "The Alchemist"
            }
          ]
        },
        {
          "id": 2,
          "name": 1,
          "count": 2,
          "books": [
            {
              "id": 1,
              "name": "Facebook"
            },
            {
              "id": 1,
              "name": "The Master Blaster"
            }
          ]
        }
      ]
    },
    {
      "id": "2",
      "name": "B",
      "Floor": [
        {
          "id": 1,
          "name": 0,
          "count":2,
          "books": [
            {
              "id": 1,
              "name": "Know Your self"
            },
            {
              "id": 1,
              "name": "The Naga"
            }
          ]
        },
        {
          "id": 2,
          "name": 1,
          "count":2,
          "books": [
            {
              "id": 1,
              "name": "The Data Analyics"
            },
            {
              "id": 1,
              "name": "Become Master of R"
            }
          ]
        }
      ]
    }
  ]
}

每当添加/删除一本书时,它都应该反映在楼层的count属性中

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    根据the documentation,对于只读,这样的东西应该可以工作:

    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
    
    class FloorSerializer(serializers.ModelSerializer):
        book = BookSerializer(many=True, read_only=True)
    
        class Meta:
            model = Floor
    
    class BlockSerializer(serializers.ModelSerializer):
        Floor = FloorSerializer(many=True, read_only=True)
    
        class Meta:
            model = Block
    

    For writing/updating, 将 create 和/或 update 方法写入 BlockSerializer。

    class BlockSerializer(serializers.ModelSerializer):
        Floor = FloorSerializer(many=True)
    
        class Meta:
            model = Block
    
        def create(self, validated_data):
            floors_data = validated_data.pop('Floors')
            block = Blocks.objects.create(**validated_data)
            for floor_data in floors_data:
                books_data = floor_data.pop('books')
                floor = Floor.objects.create(block=block, **floor_data)
                for book_data in books_data:
                    Book.objects.create(floor=floor, **book_data)
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 2015-03-07
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多