Проверьте поле в модели в generics.RetrieveDestroyAPIView - PullRequest
0 голосов
/ 23 мая 2018

Я пишу API отдыха.это мой взгляд:

class OrderDeleteAPIView(generics.RetrieveDestroyAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderDeleteSerializer
    # permission_classes = (OwnerCanManageOrReadOnly,)
    lookup_field = 'id'

и это его модель:

class Order(models.Model):
    product = models.ForeignKey(Product)
    customer = models.ForeignKey(Customer, null=True)WAITING = 'WA'
    PREPARATION = 'PR'
    READY = 'RD'
    DELIVERED = 'DV'
    STATUS_CHOICES = (
        (WAITING, 'waiting'),
        (PREPARATION, 'preparation'),
        (READY, 'ready'),
        (DELIVERED, 'delivered'),
        )
    status = models.CharField(
      max_length=2,
      choices=STATUS_CHOICES,
      default=WAITING,
    ) 

и:

class Customer(models.Model):
    name = models.CharField(max_length=40)
    customer_email = models.EmailField()
    def __str__(self):
        return self.name

и это его сериализатор:

class OrderDeleteSerializer(ModelSerializer):
    class Meta:
        model = Order
        fields = '__all__'

Что мне делать, если я хочу, чтобы объект (заказ) можно было удалить только тогда, когда в поле состояния «ожидание»?

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете реализовать некоторые проверки в destroy и возвращать сообщение об ошибке в качестве ответа, если ограничения не выполнены:

class OrderDeleteAPIView(generics.RetrieveDestroyAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderDeleteSerializer
    # permission_classes = (OwnerCanManageOrReadOnly,)
    lookup_field = 'id'

    <b> def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if instance.status != Order.WAITING:
            return JsonResponse(
                status=412,
                data={'status':'false',
                      'message': 'status should be WAITING'}
            )
        super(OrderDeleteAPIView, self).destroy(request, *args, **kwargs)</b>

Конечно, вы можете вернуть любойсвоего рода ответ (не сам по себе ответ JSON, а статус не должен быть 412).Обычно код состояния HTTP 412 означает, что 412 Precondion не удалось .

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