Переопределение метода DELETE модели с реального удаления на установку свойства во фреймворке Django RESTful

Мы используем django-rest-framework в качестве бэкенда. У меня есть модель Product, которая является внешним ключом другой модели Order, которая действует и как заказ, и как журнал аудита.

Теперь предположим, что мы больше не собираемся продавать этот продукт. Нам нужно применить метод DELETE к Продукту; и мы по-прежнему хотим сохранить все в Заказе. Однако, если Продукт действительно удален, а метод on_delete на нем SET_NULL, то вся информация, связанная с Продуктом, будет потеряна. А это не то, чего я хотел.

class Order(models.Model):
    product = models.ForeignKey(Product, blank=True, null=True, on_delete=models.SET_NULL)

Итак, мой вопрос таков:

  1. A common practice in other framework is using soft-delete, i.e. adding a "delete=0" property on Product. And the DELETE method only change the property to "delete=1" rather than real delete. Is it do-able when using django-rest-framework? And how?

  2. Is there any other good practices to realize this requirement, i.e. to delete the foreign key while perserving the foreign key's metadata?

Вы можете добавить одно дополнительное поле в модель продукта.

Например.

class Product(models.Model):
    name = models.CharField(max_length=50)
    is_deleted = models.BooleanField(default=False)

Теперь при удалении продукта вы просто меняете флаг is_deleted на True.

Например, если вы используете ModelViewset

class ProductViewset(ModelViewSet):
    .......
      
    def destroy(self, request, *args, **kwargs):
         product = self.get_object()
         product.is_deleted = True
         product.save()
         return Response(status=status.HTTP_200_OK)

Теперь вы должны запросить все объекты продукта с помощью

Product.objects.filter(is_deleted=False)

вместо

Product.objects.all()
Вернуться на верх