Django verfügt über verschiedene numerische Felder zur Verwendung in Modellen, z . B. DecimalField und PositiveIntegerField . Ersteres kann zwar auf die Anzahl der gespeicherten Dezimalstellen und die Gesamtzahl der gespeicherten Zeichen beschränkt werden. Gibt es jedoch eine Möglichkeit, das Speichern nur von Zahlen innerhalb eines bestimmten Bereichs zu beschränken, z. B. 0,0-5,0?
Wenn dies nicht der Fall ist, gibt es eine Möglichkeit, ein PositiveIntegerField so einzuschränken, dass beispielsweise nur Zahlen bis zu 50 gespeichert werden?
Update: Nachdem Bug 6845 geschlossen wurde , ist diese StackOverflow-Frage möglicherweise nicht mehr aktuell. - Sampablokuper
python
django
django-models
numbers
sampablokuper
quelle
quelle
Antworten:
Sie können auch einen benutzerdefinierten Modellfeldtyp erstellen - siehe http://docs.djangoproject.com/de/dev/howto/custom-model-fields/#howto-custom-model-fields
In diesem Fall können Sie vom integrierten IntegerField 'erben' und dessen Validierungslogik überschreiben.
Je mehr ich darüber nachdenke, desto nützlicher wird mir, dass dies für viele Django-Apps nützlich ist. Möglicherweise könnte ein IntegerRangeField-Typ als Patch für die Django-Entwickler eingereicht werden, um das Hinzufügen zum Trunk in Betracht zu ziehen.
Das funktioniert bei mir:
Dann würden Sie es in Ihrer Modellklasse folgendermaßen verwenden (Feld ist das Modul, in das Sie den obigen Code einfügen):
ODER für einen Bereich von negativ und positiv (wie ein Oszillatorbereich):
Was wirklich cool wäre, wäre, wenn es mit dem Bereichsoperator wie folgt aufgerufen werden könnte:
Dies würde jedoch viel mehr Code erfordern, da Sie einen 'Überspringen'-Parameter angeben können - Bereich (1, 50, 2) - Interessante Idee ...
quelle
MinValueValidator(min_value) and MaxValueValidator(max_value)
vor dem Anruf hinzufügensuper().__init__ ...
(Snippet: gist.github.com/madneon/147159f46ed478c71d5ee4950a9d697d )Sie können die in Django integrierten Validatoren verwenden -
Bearbeiten : Wenn Sie direkt mit dem Modell arbeiten, müssen Sie vor dem Speichern des Modells die Methode model full_clean aufrufen , um die Validatoren auszulösen. Dies ist bei der Verwendung nicht erforderlich,
ModelForm
da die Formulare dies automatisch tun.quelle
null=True
undblank=True
funktioniert wie erwartet. Das Feld ist optional und wird leer gelassen, wenn es leer gelassen wird.quelle
Ich hatte genau das gleiche Problem; Hier war meine Lösung:
quelle
models.IntegerField(choices=[(i, i) for i in range(1, n)], blank=True)
Es gibt zwei Möglichkeiten, dies zu tun. Eine besteht darin, die Formularvalidierung zu verwenden, um niemals zuzulassen, dass ein Benutzer eine Zahl über 50 eingibt. Formularvalidierungsdokumente .
Wenn kein Benutzer an dem Prozess beteiligt ist oder Sie kein Formular zur Dateneingabe verwenden, müssen Sie die
save
Methode des Modells überschreiben , um eine Ausnahme auszulösen oder die in das Feld eingehenden Daten einzuschränken .quelle
Hier ist die beste Lösung, wenn Sie zusätzliche Flexibilität wünschen und Ihr Modellfeld nicht ändern möchten. Fügen Sie einfach diesen benutzerdefinierten Validator hinzu:
Und es kann als solches verwendet werden:
Die beiden Parameter sind max und min und erlauben Nullen. Sie können den Validator anpassen, indem Sie die markierte if-Anweisung entfernen oder Ihr Feld so ändern, dass es leer = False, null = False im Modell ist. Das erfordert natürlich eine Migration.
Hinweis: Ich musste den Validator hinzufügen, da Django den Bereich in PositiveSmallIntegerField nicht validiert, sondern eine kleine Intint (in Postgres) für dieses Feld erstellt und Sie einen DB-Fehler erhalten, wenn die angegebene Zahl außerhalb des Bereichs liegt.
Hoffe das hilft :) Mehr zu Validators in Django .
PS. Ich habe meine Antwort auf BaseValidator in django.core.validators basiert, aber bis auf den Code ist alles anders.
quelle