[PYTHON] Logisches Löschen in Django, DRF (Django REST Framework)

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.

Modell zum logischen Löschen

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.

Tatsächliches Modell

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.

Recommended Posts

Logisches Löschen in Django, DRF (Django REST Framework)
Grundlagen des Django REST-Frameworks
Tipps zum Django Rest Framework
Implementieren Sie die JWT-Anmeldefunktion im Django REST-Framework
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Listenmethode für verschachtelte Ressourcen im Django REST-Framework
Django REST Framework Stolperstein
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
Implementieren Sie hierarchische URLs mit drf-verschachtelten Routern im Django REST-Framework
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Implementierung der JWT-Authentifizierungsfunktion in Django REST Framework mit djoser
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Verstehen Sie den Komfort des Django Rest Framework
Ein Verwaltungstool, das sofort mit dem REST-Framework ng-admin + Django erstellt werden kann
CRUD GET mit Nuxt & Django REST Framework ②
Verschiedene Hinweise zum Django REST-Framework
CRUD POST mit Nuxt & Django REST Framework
CRUD GET mit Nuxt & Django REST Framework ①
Überlegungen zum Design von Django REST Framework + Clean Architecture
Implementierung der benutzerdefinierten Authentifizierungsfunktion für Benutzermodelle in Django REST Framework mit djoser
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
CRUD PUT, DELETE mit Nuxt & Django REST Framework
Modell in Django
Django REST Framework Ein wenig nützlich zu wissen.
So erstellen Sie eine Rest-API in Django
Form in Django
Manchmal möchten Sie mit DRF (Django REST Framework) auf View information from Serializer zugreifen.
Lernnotizen für die Migrationsfunktion im Django-Framework (2)
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Weitere neue Benutzerauthentifizierungsmethoden mit Django REST Framework
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
Wenn Sie mit dem Django REST-Framework filtern möchten
Implementieren Sie die API mit explosiver Geschwindigkeit mithilfe des Django REST Framework
Lernnotizen für die Migrationsfunktion im Django-Framework (3)
[Django Rest Framework] Passen Sie die Filterfunktion mit Django-Filter an
Lernnotizen für die Migrationsfunktion im Django-Framework (1)
Django Python Web Framework
Erstellen einer API, die mit BERT im Django REST-Framework negativ-positive Inferenzergebnisse zurückgibt
Modelländerungen in Django
Framework-Entwicklung mit Python
Zurücksetzen des Passworts über die API mit dem Django Rest Framework
Django Rest Framework Dekorateure `Action Decorator ersetzt list_route und detail_route`