Переопределение метода 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)
Итак, мой вопрос таков:
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?
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()