Wie benutze ich full_clean () für die Datenüberprüfung, bevor ich in Django 1.5 ordentlich speichern kann?

8

Ich denke, Djangos Modellvalidierung ist etwas unpraktisch für jene Modelle, die kein integriertes ModelForm verwenden, obwohl sie nicht wissen, warum.

Zuerst muss full_clean() manuell aufgerufen werden.

  

Beachten Sie, dass full_clean () nicht automatisch aufgerufen wird, wenn Sie anrufen   Die save () -Methode Ihres Modells, noch als Ergebnis von ModelForm validation.In   Fall der ModelForm-Validierung, Model.clean_fields (), Model.clean (),   und Model.validate_unique () werden alle einzeln aufgerufen. Das müssen Sie tun   Rufen Sie full_clean manuell auf, wenn Sie ein einstufiges Modell ausführen möchten   Validierung für Ihre eigenen manuell erstellten Modelle.

Zweitens wird validators in der integrierten ModelForm verwendet.

  

Beachten Sie, dass Validatoren beim Speichern von a nicht automatisch ausgeführt werden   Modell, aber wenn Sie ein ModelForm verwenden, wird es Ihre Validatoren ausführen   auf allen Feldern, die in Ihrem Formular enthalten sind.

Es gibt große Anforderungen, wenn Sie eine Datenüberprüfung durchführen müssen, bevor Sie Daten in Datenbanken speichern. Und natürlich würde ich es lieber im Modell als in den Ansichten machen. Gibt es also gute Ideen, dies in Django 1.5 sinnvoll umzusetzen?

Irgendwelche Ideen willkommen, und danke!

    
ray6080 23.03.2014, 04:18
quelle

1 Antwort

11

Obwohl die Idee, die Validierung auf Model-Ebene durchzusetzen, richtig erscheint, tut Django dies aus verschiedenen Gründen nicht standardmäßig. Abgesehen von einigen Abwärtskompatibilitätsproblemen möchten die Autoren dies wahrscheinlich nicht unterstützen, da sie befürchten, dass dies zu einem falschen Sicherheitsgefühl führen könnte, wenn nicht garantiert ist, dass Ihre Daten immer validiert werden. Einige ORM-Methoden (z. B. bulk_create oder update ) rufen save() nicht auf und können daher Ihre Modelle nicht validieren. Mit anderen Worten, es ist schwierig, die Validierung zu garantieren, daher haben sie sich entschieden, es nicht so zu tun.

Wenn Sie dies für mehrere Modelle benötigen, können Sie eine einfache Mischung erstellen, die die Methode save() überschreibt und full_clean() vor super aufruft. Beachten Sie, dass dies in einigen Fällen dazu führen kann, dass die Validierung zweimal ausgeführt wird, beispielsweise bei der Verwendung von ModelForm. Es ist jedoch nicht unbedingt ein Problem, wenn Ihre Validierungsroutinen nebenwirkungsfrei und kostengünstig sind.

Weitere Informationen finden Sie in diesen Antworten:

Jozef Knaperek 15.05.2014 16:40
quelle

Tags und Links