[PYTHON] Suppression logique dans Django, DRF (Django REST Framework)

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.

Modèle de suppression logique

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.

Modèle réel

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

Suppression logique dans Django, DRF (Django REST Framework)
Bases du framework Django REST
Astuces Django Rest Framework
Implémenter la fonctionnalité de connexion JWT dans le framework Django REST
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
List, méthode pour les ressources imbriquées dans le framework Django REST
Bloc d'achoppement du framework Django REST
Framework Django REST avec Vue.js
Connectez-vous avec Django Rest Framework
Implémenter des URL hiérarchiques avec des routeurs imbriqués drf dans le framework Django REST
Comment écrire une validation personnalisée dans Django REST Framework
[Django] Utiliser MessagePack avec le framework Django REST
Implémentation de la fonction d'authentification JWT dans Django REST Framework à l'aide de djoser
Créer une API RESTful avec Django Rest Framework
Comprendre la commodité de Django Rest Framework
Un outil administratif qui peut être créé immédiatement avec le framework ng-admin + Django REST
CRUD GET avec Nuxt & Django REST Framework ②
Notes diverses sur le framework Django REST
CRUD POST avec Nuxt & Django REST Framework
CRUD GET avec Nuxt & Django REST Framework ①
Django REST Framework + Considération de conception d'architecture propre
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
Comment gérer les caractères déformés dans json de Django REST Framework
CRUD PUT, DELETE avec Nuxt & Django REST Framework
Modèle dans Django
Framework Django REST Un peu utile à savoir.
Comment créer une API Rest dans Django
Formulaire à Django
Parfois, vous souhaitez accéder aux informations de vue depuis Serializer avec DRF (Django REST Framework)
Notes d'apprentissage pour la fonction migrations dans le framework Django (2)
Créer une application Todo avec Django REST Framework + Angular
Plus de nouvelles méthodes d'authentification des utilisateurs avec Django REST Framework
Essayez de créer une application Todo avec le framework Django REST
Créer une API autour de l'authentification des utilisateurs avec Django REST Framework
Lorsque vous souhaitez filtrer avec le framework Django REST
Implémentez l'API à une vitesse explosive en utilisant Django REST Framework
Notes d'apprentissage pour la fonction migrations dans le framework Django (3)
[Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter
Notes d'apprentissage pour la fonction migrations dans le framework Django (1)
Framework Web Django Python
Création d'une API qui renvoie des résultats d'inférence négatifs-positifs à l'aide de BERT dans le framework Django REST
Modifications du modèle dans Django
Développement de framework avec Python
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Décorateurs du cadre de repos Django ʻaction decorator remplace list_route et detail_route`