我创建了一个基本模型:
class CreateUpdateDeleteModel(models.Model):
from django.contrib.auth import get_user_model
from django.utils.text import gettext_lazy as _
from .managers import BakeryManager
from drfaddons.datatypes import UnixTimestampField
create_date = UnixTimestampField(_('Create Date'), auto_now_add=True)
created_by = models.ForeignKey(get_user_model(), on_delete=models.PROTECT,
related_name='%(app_label)s_%(class)s_creator')
delete_date = models.DateTimeField(_('Delete Date'), null=True, blank=True)
deleted_by = models.ForeignKey(get_user_model(), on_delete=models.PROTECT, null=True, blank=True,
related_name='%(app_label)s_%(class)s_destroyer')
update_date = models.DateTimeField(_('Date Modified'), auto_now=True)
updated_by = models.ForeignKey(get_user_model(), on_delete=models.PROTECT, null=True, blank=True,
related_name='%(app_label)s_%(class)s_editor')
objects = BakeryManager()
class Meta:
abstract = True
我希望在我的系统中,所有元素都被软删除,即,每删除一个对象,它的行为都应如下:
models.PROTECT
设置为on_delete
的值,则引发错误;如果它是models.SET_NULL
,则设置为null,以此类推。delete_date
model.objects.all()
也不应包含已删除的对象。我该怎么做?
我正在考虑覆盖get_queryset()
,这可能会解决problem 3
。但是1
和2
呢?
答案 0 :(得分:1)
非常奇怪的请求。
第1点。目前尚不清楚。在哪里显示错误?
点2。删除作为状态而不是数据的隐藏进行管理。我建议您添加一个状态字段,并使用更改状态的特殊功能来管理删除。您可以覆盖delete
,但是请注意,查询集中的删除操作不会调用Model.delete,而是直接运行SQL代码。
说这是个坏主意。删除必须在那里,但不能使用。您可以轻松地从Django管理员中删除删除操作,并且开发人员没有理由删除代码,除非他/她不负责任地使用Django shell。 (数据库备份?)
第3点。如果您不想在admin中显示数据,则只需覆盖Admin ModelForm即可在对象的STATUS为DELETE时隐藏数据。糟糕的设计是操纵域以适应表示层。