python / expert
Snippet
Dynamische Modellfeld-Injektion via Metaklassen-Klassendekoratoren
Django-Modellstrukturen können mithilfe der internen contribute_to_class-Methode in Klassendekoratoren vor der ORM-Schema-Initialisierung dynamisch erweitert werden.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db import modelsdef add_audit_timestamp_fields(cls):created_field = models.DateTimeField(auto_now_add=True)updated_field = models.DateTimeField(auto_now=True)created_field.contribute_to_class(cls, 'created_at')updated_field.contribute_to_class(cls, 'updated_at')return cls@add_audit_timestamp_fieldsclass AuditLogEntry(models.Model):action = models.CharField(max_length=255)class Meta:app_label = 'analytics'
django
Erklärung
1
def add_audit_timestamp_fields(cls):
Definiert einen Klassendekorator, der eine Ziel-Django-Modellklasse als Eingabe erhält.
2
created_field.contribute_to_class(cls, 'created_at')
Ruft Djangos interne Feld-Lifecycle-API auf, um Modellfelder dynamisch zu injizieren und zu registrieren.
3
@add_audit_timestamp_fields
Wendet die Feldinjektion während der Modulladezeit an, bevor das Django-Modell-Setup abgeschlossen ist.