python / expert
Snippet
Django Custom Model Field mit from_db_value Transformation
Custom Model Fields in Django ermöglichen es zu definieren, wie Daten gespeichert und aus der Datenbank abgerufen werden. Die from_db_value Methode wird beim Laden von Daten aus der Datenbank aufgerufen und ermöglicht Transformationen in Echtzeit. Dieses Muster ist unerlässlich für die Implementierung von Verschlüsselung auf Feldebene, die Unterstützung von Legacy-Datenformaten oder die Erstellung berechneter Felder, die ihre Werte aus anderen gespeicherten Daten ableiten.
snippet.py
1
import re\nfrom django.db import models\n\nclass EncryptedCharField(models.CharField):\n def __init__(self, *args, **kwargs):\n self.encryption_key = kwargs.pop('encryption_key', None)\n super().__init__(*args, **kwargs)\n\n def deconstruct(self):\n name, path, args, kwargs = super().deconstruct()\n if self.encryption_key:\n kwargs['encryption_key'] = self.encryption_key\n return name, path, args, kwargs\n\n def get_prep_value(self, value):\n if value is None:\n return value\n return self._encrypt(value)\n\n def from_db_value(self, value, expression, connection):\n if value is None:\n return value\n return self._decrypt(value)\n\n def _encrypt(self, value):\n if self.encryption_key:\n return f'ENC:{value[::-1]}'\n return value\n\n def _decrypt(self, value):\n if value and value.startswith('ENC:'):\n return value[4:][::-1]\n return value
django
Erklärung
1
class EncryptedCharField(models.CharField):
Definiert ein Custom Field, das von CharField erbt und verschlüsselte Stringspeicherung über mehrere Modelle hinweg ermöglicht
2
def from_db_value(self, value, expression, connection):
Database-Value-Hook, der während der Model-Hydration aus der DB aufgerufen wird und Transformationen ermöglicht
3
def get_prep_value(self, value):
Bereitet Werte vor der Datenbankeinfügung vor, wendet Verschlüsselung an, sodass Klartext nie die DB berührt
4
def deconstruct(self):
Erforderlich für Django Migrations, um Custom Field Parameter wie encryption_key während der Schema-Generierung zu serialisieren