Запрос объектов из 1: M связанных моделей DRF - PullRequest
0 голосов
/ 24 января 2019

Разработана модель Django с многоуровневыми отношениями 1: M, способная получить ответ json, записывающий сериализаторы в DRF. Выглядит легко выполнять операции CRUD, но только для этой таблицы. Я ожидаю, что ответ будет похож на ответ ниже, а затем встретился с термином, называемым Nested Serializer , поскольку я не очень осведомлен об этом, могу кто-то предлагает мне один для модели ниже

{
  "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 на этаже

1 Ответ

0 голосов
/ 24 января 2019

Согласно документации , только для чтения, что-то вроде этого должно работать:

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

Для записи / обновления записать методы создания и / или обновления в 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)

Надеюсь, это поможет

...