Django Rest Framework создает несколько объектов - PullRequest
0 голосов
/ 06 января 2019

Это то, что я имею до сих пор.

Мой сериализатор:

class MySerializer(serializers.ModelSerializer):

     class Meta:
         model = MyModel
         fields = ('field_1', 'field_2', 'field_3')

Мой ModelViewset

class MyViewSet(ModelViewSet):

    serializer_class = MySerializer
    model = MyModel
    queryset = MyModel.objects.all().order_by('date_paid')

    def create(self, request, *args, **kwargs):
        many = True if isinstance(request.data, list) else False
        serializer = MySerializer(data=request.data, many=many)
        if serializer.is_valid():
            serializer.save()
        else:
            return Response(serializer.errors, 
status=status.HTTP_400_BAD_REQUEST)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

Моя основная проблема заключается в том, что при тестировании конечной точки для создания нескольких объектов с использованием следующей полезной нагрузки в представлении свойство request.data кажется пустым, в результате оно возвращает ошибки пропущенных полей.

{
        'data': [
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            },
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            },
            {
                'type': 'MySerializer',
                'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
                }
            }
        ]
    }

Однако при использовании одного экземпляра объекта:

{
        'data': {
            'type': 'MySerializer',
            'attributes': {
                    'field_1': 1,
                    'field_2': 0.05,
                    'field_3': 'abc'
            }
        }
    }

Кажется, что он работает нормально, и объект создан.

Я пробовал несколько способов размещения полезной нагрузки:

  • Размещение списка объектов внутри поля attributes.
  • Размещение списка экземпляров непосредственно в поле data, но при этом возвращается либо ошибка объекта, либо пустое значение request.data

Как я должен отправлять данные для нескольких объектов, возможно ли это, я читал во многих статьях, что достаточно просто поместить many=True в экземпляр сериализатора, чтобы выполнить это, но я просто не могу получить данные из запроса.

Любой шаг, который я пропустил, или другой обходной путь?

EDIT

Забыл упомянуть две вещи

  1. что я использую django rest framework json api , может ли это быть причиной того, что данные пусты?
  2. Я разместил словари, так как проверяю конечные точки и использую json.dumps (полезную нагрузку) при отправке данных.

1 Ответ

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

Хорошо, я на самом деле удивлен, что создание отдельного экземпляра объекта работает, так как данные, похоже, не в правильном формате. Когда используется аргумент many, сериализатор ожидает список, но вы отправляете объект json.

Это то, что JSON должно понравиться:

    [
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        },
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        },
        {

              "field_1": 1,
              "field_2": 0.05,
              "field_3': "abc"

        }
    ]

Здесь следует отметить следующие моменты:

  1. JSON начинается со списка
  2. Поля находятся непосредственно в теле каждого объекта - нет поля type или attribute, ожидайте, что вы реализуете логику для анализа этого в вашем сериализаторе
  3. JSON использует не одинарные, а двойные

Вы проверяли request.data, чтобы подтвердить, что он пустой, как вы сказали? Если так, то это вообще другая проблема, так как это может быть проблемой синтаксического анализа.

РЕДАКТИРОВАТЬ: Использование JSON API

После небольшого рытья в json api github-странице структуры фреймворка я обнаружил эту проблему , запрашивающую поддержку массовых операций. По-видимому, они добавили его в этот запрос на получение , и вы можете увидеть правильный формат нескольких объектов в комментариях.

Ваш должен быть таким:

{
"data": [
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    },
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    },
    {
        "type": "MySerializer",
        "attributes": {
            "field_1": 1,
            "field_2": 0.05,
            "field_3": "abc"
        }
    }
]

}

Скорее всего, парсер не смог проанализировать данные в указанном вами формате, и поэтому ваш request.data пуст.

РЕДАКТИРОВАТЬ 2:

Хотя функция массовых операций не была интегрирована в спецификации json-api, JSON-API Django Rest уже добавил для нее специальный анализатор. Так что вам придется добавить этот синтаксический анализатор JSONAPIBulkParser, чтобы он работал. Проверьте этот комментарий в PR

...