Как вернуть сообщение об ошибке для каждого POST-запроса (каждого массива объектов JSON)? - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над заявкой на заказ в ресторане.Порядок элементов будет создан, поскольку объект Array of JSON будет помещен в POST для создания моделей деталей, но если запас какого-либо элемента недостаточен, это вызовет исключение.Но я могу дать ошибку только для одного элемента, а не для всех.

Например:

Текущий запас

Яблоко 5шт

Манго 10шт

Когда я делаю заказ из яблок 10шт и из манго 20шт.Я хочу получить сообщение об ошибке, в котором говорится, что «запасов яблок и манго недостаточно».Но в настоящее время я получаю только «запасов Apple недостаточно», потому что я ставлю яблоко в качестве первого объекта в массиве.Если я поставлю манго в качестве первого объекта, я получу «Склад манго не достаточен».

Для полного кода, вы можете проверить ссылку репо: здесь .Мои модели:

class Menu(models.Model):
    image = models.ImageField(upload_to=path_and_rename)
    name = models.CharField(max_length=100)
    price = models.IntegerField()
    category = models.IntegerField()
    availability = models.BooleanField(default=False)
    qty = models.IntegerField(default=100)
    sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)


class OrderDetail(models.Model):
    orderID = models.ForeignKey(Order, on_delete=models.PROTECT)
    menuID = models.ForeignKey(Menu, on_delete=models.PROTECT)
    price = models.IntegerField()
    qty = models.IntegerField()
    tableNumber = models.IntegerField()
    done = models.BooleanField(default=False)
    # orderTime = models.DateTimeField(auto_now_add=True)
    # finishTime = models.DateTimeField(auto_now=True)
    finishTime = models.DateTimeField(null=True, blank=True)
    sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        if self.done:
            self.finishTime = datetime.datetime.now()
        else:
            menuID = self.menuID.id
            menuObject = Menu.objects.get(id=menuID)
            tempQty = menuObject.qty - self.qty
            if tempQty>=0:
                menuObject.qty = tempQty
                menuObject.save()
            else:
                # return serializers.ValidationError()
                raise serializers.ValidationError(menuObject.name + ": STOCK IS NOT SUFFICIENT")
        super().save(force_insert, force_update, using, update_fields)

Мой взгляд:

class OrderDetailViewset(viewsets.ModelViewSet):
    serializer_class = serializers.OrderDetailSerializer
    def get_queryset(self):
        queryset = models.OrderDetail.objects.all()
        sellerID = self.request.query_params.get('sellerID', None)
        done = self.request.query_params.get('done', None)
        if sellerID is not None:
            queryset = queryset.filter(sellerID=sellerID)
            if done is not None:
                queryset = queryset.filter(sellerID=sellerID, done=done)
        return queryset

    # Enable Post of List
    # https://stackoverflow.com/questions/37329771/django-rest-bulk-post-post-array-of-json-objects
    # Accessed on March 9, 2019
    def create(self, request, pk=None, company_pk=None, project_pk=None):
        is_many = True if isinstance(request.data, list) else False

        serializer = self.get_serializer(data=request.data, many=is_many)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Мне кажется, проблема в том, где я поднял Исключение, но я понятия не имею, как его исправить.Спасибо прежде!

1 Ответ

1 голос
/ 25 марта 2019

как вы правильно сказали, проблема находится там, где вы подняли исключение: ModelViewSet.create> serializer.is_valid(raise_exception=True).

На основе документов DRF :

При десериализации данных вам всегда нужно вызывать is_valid (), прежде чем пытаться получить доступ к проверенным данным или сохранить экземпляр объекта.

...

Метод .is_valid () принимает необязательный флаг Повышение_отключения, который вызывает его при возникновении исключения serializers.ValidationError, если имеются ошибки проверки.

Эти исключения автоматически обрабатываются обработчиком исключений по умолчанию, который предоставляет среда REST, и по умолчанию будут возвращать ответы HTTP 400 Bad Request.

Итак, первый объект, достигший этой проверки, возвращает HTTP 400 Bad Request, о котором вы упомянули.

Вам нужно будет настроить проверку, чтобы она не возвращала HTTP 400 Bad Request, реализовать собственную проверку в serializer и / или перехватить и обработать эти исключения в представлении, таким образом, вы получите необходимую гибкость обрабатывать эти грузы.

Взгляните на код DRF и документы DRF .

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...