python / expert
Snippet
Benutzerdefiniertes Django-Modellfeld für binäre Array-Speicherung
Durch die Erweiterung der Modellfeld-Architektur von Django können Entwickler benutzerdefinierte Datentypen erstellen. Hier werden OOP-Prinzipien genutzt, um BinaryField zu untergliedern und native Python-Array-Objekte ('array.array') nahtlos in rohe Datenbank-Bytes zu serialisieren und zu deserialisieren.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import arrayfrom django.db import modelsclass IntArrayField(models.BinaryField):"""Custom Django model field encapsulating Python array.array for efficient binary storage."""def to_python(self, value):if value is None or isinstance(value, array.array):return valuearr = array.array('i')arr.frombytes(bytes(value))return arrdef from_db_value(self, value, expression, connection):return self.to_python(value)def get_prep_value(self, value):prep_val = super().get_prep_value(value)if isinstance(prep_val, array.array):return prep_val.tobytes()return prep_val
django
Erklärung
1
class IntArrayField(models.BinaryField):
Erbt von Djangos BinaryField, um ein spezialisiertes Feld zur Speicherung gepackter Integer-Arrays zu erstellen.
2
def to_python(self, value):
Wandelt rohe Datenbank-Bytes bei der Modell-Instanziierung in ein natives Python-array.array-Objekt um.
3
def from_db_value(self, value, expression, connection):
Django-Hook, der to_python automatisch ausführt, wenn Werte direkt vom Datenbanktreiber abgerufen werden.
4
def get_prep_value(self, value):
Bereitet das Python-Array-Objekt für die DB-Einfügung vor, indem Array-Bytes in Standard-Binärnutzdaten konvertiert werden.