Обновление столбца в Django Rest Api вызывает ошибку 'Column not null' - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь «удалить» столбец, изменив его статус (да, он есть в моей модели и устанавливается при создании) вместо физического удаления его из базы данных. Поэтому я создал свой вид и запросил элемент. Когда я отправляю запрос на публикацию, я получаю сообщение об ошибке: «Столбец« seller_id »не может быть пустым». Я исследовал и вижу, что в models.py мне нужно просто изменить null=True. Проблема в том, что я не хочу, чтобы этот столбец был нулевым при создании элемента. Есть ли способ, которым я могу обновить одно поле, не обновляя необнуляемое поле? Нужно ли при обновлении включать необнуляемую информацию?

models.py

seller = models.ForeignKey(AppUser, blank=True, null=False, on_delete=models.SET('inactive'), related_name='product', verbose_name='User')

views.py

class ProductDeleteView(generics.ListCreateAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductDeleteSerializer
    permission_classes = (IsAdminOrOwnerOrReadOnly,)

    def get_queryset(self):
        if self.kwargs.get('pk', None) is not None:
            return Product.objects.get(pk=self.kwargs['pk'])
        else:
            data = {'full_messages': ['Could not delete product.']}
            return Response(data, status=status.HTTP_403_FORBIDDEN)

    def delete(self):
        product = queryset
        product.status = 99
        product.save()

        data = {'full_messages': ['Product deleted successfully.']}
        return Response(data, status=status.HTTP_200_OK)

serializers.py

class UserDeleteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['status']

1 Ответ

2 голосов
/ 09 января 2020

Класс ListCreateAPIView не предоставляет никакого действия удаления по умолчанию. Для операций удаления используйте generics.DestroyAPIView класс и переопределение perform_destroy(...) и destroy(...) методы для получить желаемый результат

from rest_framework import status
from rest_framework.response import Response
from rest_framework import generics


class ProductDeleteView(generics.DestroyAPIView):
    queryset = Product.objects.all()
    <b># serializer_class = ProductDeleteSerializer # you don't need a serializer for deletion</b>
    permission_classes = (IsAdminOrOwnerOrReadOnly,)

    <b>def perform_destroy(self, instance):
        instance.status = 99
        instance.save()

    def destroy(self, request, *args, **kwargs):
        super().destroy(request, *args, **kwargs)
        return Response({'detail': 'deleted'}, status=status.HTTP_204_NO_CONTENT)</b>

Чтобы удалить (временно) экземпляр Product, необходимо вызвать /path/to/end-point/<product_id>/, используя HTTP DELETE

...