Wo sollte die Validierung von Modellfelder in Django gehen?Django Modellfelder Validierung
Ich könnte mindestens zwei mögliche Alternativen nennen: in der überladenen .save() - Methode des Modells oder in der .to_python() -Methode der models.Field-Unterklasse (offensichtlich dafür müssen Sie benutzerdefinierte Felder schreiben) .
Mögliche Anwendungsfälle:
- , wenn es unbedingt erforderlich, um sicherzustellen, dass ein leerer String nicht in die Datenbank geschrieben werden (blank = False Schlüsselwort-Argument hier nicht funktioniert, ist es für Form Validierung nur)
- , wenn es notwendig ist, um sicherzustellen, dass „Entscheidungen“ Keyword-Argument auf einer db-Ebene eingehalten wird und nicht nur in der Admin-Interface (Art einen Aufzählungsdatentyp emuliert)
es gibt auch eine Attribut auf Klassenebene empty_strings_allowed
in der models.Field-Basisklassendefinition und abgeleiteten Klassen überschreiben diese glücklicherweise, aber es scheint keine Auswirkungen auf die Datenbankebene zu haben, was bedeutet, dass ich immer noch ein Modell mit leeren String-Feldern konstruieren und es in der Datenbank speichern kann. Was ich vermeiden möchte (ja, es ist notwendig).
Mögliche Implementierungen
auf der Feldebene sind:
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
raise IntegrityError(_('Empty string not allowed'))
return models.CharField.to_python(self, value)
auf Modellebene:
class MyModel(models.Model)
FIELD1_CHOICES = ['foo', 'bar', 'baz']
field1 = models.CharField(max_length=255,
choices=[(item,item) for item in FIELD1_CHOICES])
def save(self, force_insert=False, force_update=False):
if self.field1 not in MyModel.FIELD1_CHOICES:
raise IntegrityError(_('Invalid value of field1'))
# this can, of course, be made more generic
models.Model.save(self, force_insert, force_update)
Vielleicht bin ich etwas fehlt und dies einfacher durchgeführt werden kann (und sauberer)
Großartig, großartig, das ist einfach großartig! Ich habe die Quelle überflogen (übrigens, gibt es eine Möglichkeit, auf die Dokumentation zuzugreifen, wie es mit dem Trunk möglich ist?) Und es scheint genau das zu sein, was ich brauche. Ich meine, ich bin dafür, mein eigenes zu rollen, aber Django ist _excellent_ bei der Bereitstellung einer einheitlichen Art und Weise, Dinge zu tun (na ja, IMO, jedenfalls). – shylent
Überprüfen Sie diesen Zweig, stellen Sie sicher, dass Sie docutils und Sphinx installiert haben, gehen Sie dann in das Verzeichnis docs/und führen Sie "make html" aus. Das sollte die Dokumente in HTML-Form wie auf der Django-Website erstellen, und Sie können lokal auf sie zugreifen. –
Ok, ich bin zurück vom Lesen der Quelle (insbesondere 'models/fields/__ init __. Py', models/base.py und core/validators.py), da die Dokumentation ab sofort nichts über die Modellvalidierung sagt. Man sollte jedoch beachten, dass es fast genauso funktioniert wie die Validierung von Formularen (zumindest ist die allgemeine Logik mehr oder weniger die gleiche). Wie auch immer, das ist etwas, wonach ich gesucht habe. Ich hoffe nur, dass meine Apps nicht schrecklich kaputt gehen werden, wenn ich nur vom Stamm in diesen Zweig umschalte. – shylent