Mis à part les bonnes et les mauvaises histoires de suppression logique, dans les systèmes financiers, etc., aucune donnée antérieure ne doit être supprimée de l'historique physique (pendant une certaine période de temps), et la suppression logique peut être utilisée. J'ai vu quelques articles sur la façon d'implémenter la suppression logique dans DRF, mais puisque nous l'avons implémentée de cette façon, nous franchirons le pas et le publierons.
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):
"""
Suppression logique
Model.objects.all().delete()
:return:
Nombre de cas supprimés
"""
return super(XQuerySet, self).update(is_active=False, deleted=now_tz())
def delete_hard(self):
"""
Suppression physique
Model.objects.all().delete_hard()
:return:
Nombre de cas supprimés
"""
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="Indicateur de suppression logique"
)
deleted = models.DateTimeField(
null=True,
default=None,
editable=False,
help_text="Heure de la suppression logique"
)
"""
Gestionnaire utilisé pour la recherche normale
Ce qui a été supprimé logiquement ne s'affiche pas
"""
objects = XModelManagerActive()
"""
Gestionnaire utilisé pour la recherche globale
Affichage incluant ceux qui ont été supprimés logiquement
"""
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
J'ai créé deux ModelManagers et je les ai utilisés correctement, mais comme le basique (généralement utilisé) est «objets», c'est un mécanisme qui supprime logiquement sans que le programmeur ne prête une attention particulière.
class Category(XModel):
name = models.CharField(
max_length=32,
null=False,
blank=False,
default="",
help_text="Nom de catégorie"
)
key = models.CharField(
max_length=32,
null=False,
blank=False,
default="",
help_text="Nom de la catégorie Anglais"
)
Il hérite juste de XModel. Il est également livré avec get_or_none
.
Par exemple, si vous souhaitez accéder aux données qui ont été supprimées logiquement par l'administrateur, vous pouvez le faire.
@admin.register(Category)
class AdminUserAdmin(admin.ModelAdmin):
list_display = ('key', 'name')
def get_queryset(self, request):
return self.model.entire.all()
XTech utilise le Django REST framework
pour développer l'API. Nous avons beaucoup d'extensions qui peuvent atteindre la partie irritante du DRF, donc j'aimerais le rendre public autant que possible, alors restez à l'écoute.
Recommended Posts