python / expert
Snippet
Automatisiertes Query-Scoping durch Metaklassen-QuerySet-Injektion
Durch Anpassung der ModelBase-Metaklassenkonstruktion erhalten Modelle bei der Klassendefinition automatisch benutzerdefinierte QuerySet-Manager für einheitliches Auditing ohne manuelle Zuweisung.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.db import modelsclass AuditedQuerySet(models.QuerySet):def active(self):return self.filter(is_deleted=False)class AutoAuditMeta(models.base.ModelBase):def __new__(mcs, name, bases, attrs):cls = super().__new__(mcs, name, bases, attrs)if not cls._meta.abstract:manager = models.Manager.from_queryset(AuditedQuerySet)()manager.contribute_to_class(cls, 'objects')return clsclass BaseAuditedModel(models.Model, metaclass=AutoAuditMeta):is_deleted = models.BooleanField(default=False)class Meta:abstract = True
django
Erklärung
1
class AuditedQuerySet(models.QuerySet):
Definiert domänenspezifische QuerySet-Filter-Methoden wie das Ausfiltern weich gelöschter Objekte.
2
class AutoAuditMeta(models.base.ModelBase):
Benutzerdefinierte Metaklasse, die von Djangos interner ModelBase-Klasse erbt.
3
manager = models.Manager.from_queryset(AuditedQuerySet)()
Erstellt dynamisch eine Manager-Klasse basierend auf benutzerdefinierten QuerySet-Methoden.
4
manager.contribute_to_class(cls, 'objects')
Weist den erzeugten Manager als Standard-Attribut 'objects' auf nicht-abstrakten Modellen zu.