Массовая вставка в django остальной каркас - PullRequest
0 голосов
/ 05 февраля 2020

Когда я пытаюсь создать несколько экземпляров в одном запросе, отображается ошибка, если один экземпляр неверен в пакете. Но как я могу написать свой метод создания для вставки правильных экземпляров в пакет. Это означает, что только правильные экземпляры будут вставлены в БД, а также покажут сообщение об ошибках для неправильных экземпляров.

[
    {
        "name": "oil",
        "unit_price": 200
    },
    {
        "name": "meat",
        "unit_type": "raw",
        "unit_price": 1000
    }
        "name": "salt",
        "unit_type": "raw",
        "unit_price": -100
    }

]

Я хочу вставить первые два экземпляра, которые будут вставлены в БД, а для последнего он выдаст ошибку, подобную этой.

    "errors":
 [

        {
            "unit_price": [
                "Enter positive number."
            ]
        }
 ]

Вот мой сериализатор

class ProductSerializer(serializers.ModelSerializer):

    def validate_unit_price(self, value):
         if (value) > 0:
             return value
         raise serializers.ValidationError("Enter positive number.")

    class Meta:
        model  = Product
        fields = [ 'name', 'unit_type', 'unit_price']

Также моя функция просмотра

@api_view(['POST'])
def store(request):

    serializer          =   ProductSerializer(data = request.data,many=True)

    if serializer.is_valid():
        serializer.save()
    return Response({'response_code': '500', 'response': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': 'Something went wrong', 'data': request.data, 'errors': serializer.errors})

1 Ответ

1 голос
/ 05 февраля 2020

Поскольку вы используете один экземпляр ProductSerializer, вы не сможете сохранить, если is_valid вернет False. Если вы хотите создать все допустимые наборы данных и вернуть те, которые допустили ошибку, вы можете рассмотреть возможность создания экземпляра сериализатора для каждой записи и отслеживания возвращаемых данных. Таким образом, вы можете составить список значений ответа для пользователя, чтобы частичный сбой был разрешен.

Мое предложение не сделает эту операцию "массовой", но технически это не относится к many=True. many=True просто упаковывает ваш сериализатор в ListSerializer, который просто вызывает create, используя упакованный сериализатор для каждого атрибута. Итак, вы выполняете save() для каждого экземпляра данных как есть.

...