Abgesehen von den guten und schlechten Geschichten über das logische Löschen, in Finanzsystemen usw. sollten frühere Daten (für einen bestimmten Zeitraum) nicht in der physischen Historie gelöscht werden, und das logische Löschen kann verwendet werden. Ich habe einige Artikel zum Implementieren des logischen Löschens in DRF gesehen, aber da wir es auf diese Weise implementiert haben, werden wir den Sprung wagen und es veröffentlichen.
class XQuerySet(models.QuerySet):
def get_or_none(self, *args, **kwargs):
try:
return super(XQuerySet, self).get(*args, **kwargs)
except ObjectDoesNotExist:
return None
def delete(self):
"""
Logisches Löschen
Model.objects.all().delete()
:return:
Anzahl der gelöschten Fälle
"""
return super(XQuerySet, self).update(is_active=False, deleted=now_tz())
def delete_hard(self):
"""
Physische Löschung
Model.objects.all().delete_hard()
:return:
Anzahl der gelöschten Fälle
"""
return super(XQuerySet, self).delete()
class XModelManager(models.Manager):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except ObjectDoesNotExist:
return None
def get_queryset(self):
return XQuerySet(self.model)
class XModelManagerActive(XModelManager):
def get_queryset(self):
return XQuerySet(self.model).filter(is_active=True)
class XModel(TimeStampedModel):
is_active = models.BooleanField(
default=True,
editable=False,
help_text="Flag zum logischen Löschen"
)
deleted = models.DateTimeField(
null=True,
default=None,
editable=False,
help_text="Zeitpunkt des logischen Löschens"
)
"""
Manager für die normale Suche
Was logisch gelöscht wurde, wird nicht angezeigt
"""
objects = XModelManagerActive()
"""
Manager für die globale Suche
Anzeige einschließlich der logisch gelöschten
"""
entire = XModelManager()
def delete(self, using=None, keep_parents=False, is_hard=False):
if is_hard:
return super().delete(using, keep_parents)
else:
self.deleted = now_tz()
self.is_active = False
self.save(using)
return 1, {}
def delete_hard(self, using=None, keep_parents=False):
self.delete(using, keep_parents, is_hard=True)
class Meta:
abstract = True
Ich habe zwei ModelManager erstellt und sie richtig verwendet, aber da das grundlegende (normalerweise verwendete) "Objekte" ist, ist es ein Mechanismus, der logisch gelöscht wird, ohne dass der Programmierer besonders darauf achtet.
class Category(XModel):
name = models.CharField(
max_length=32,
null=False,
blank=False,
default="",
help_text="Kategoriename"
)
key = models.CharField(
max_length=32,
null=False,
blank=False,
default="",
help_text="Kategoriename Englisch"
)
Es erbt nur von XModel. Es kommt auch mit get_or_none
.
Wenn Sie beispielsweise auf Daten zugreifen möchten, die von Admin logisch gelöscht wurden, können Sie dies tun.
@admin.register(Category)
class AdminUserAdmin(admin.ModelAdmin):
list_display = ('key', 'name')
def get_queryset(self, request):
return self.model.entire.all()
XTech verwendet das Django REST Framework
, um die API zu entwickeln. Wir haben viele Erweiterungen, die den juckenden Teil des DRF erreichen können. Deshalb möchte ich ihn so weit wie möglich veröffentlichen, also bleiben Sie dran.