Ich bin nur neugierig, ob jemand weiß, ob es einen guten Grund gibt, warum Djangos Orm für ein Modell nicht 'full_clean' aufruft, es sei denn, es wird als Teil eines Modellformulars gespeichert.
Beachten Sie, dass full_clean () nicht automatisch aufgerufen wird, wenn Sie die save () -Methode Ihres Modells aufrufen. Sie müssen es manuell aufrufen, wenn Sie eine einstufige Modellvalidierung für Ihre eigenen manuell erstellten Modelle ausführen möchten. Djangos voll sauberes Dokument
(HINWEIS: Das Zitat wurde für Django 1.6 aktualisiert. Frühere Django-Dokumente hatten ebenfalls eine Einschränkung in Bezug auf ModelForms.)
Gibt es gute Gründe, warum Menschen dieses Verhalten nicht wollen würden? Ich würde denken, wenn Sie sich die Zeit genommen hätten, einem Modell eine Validierung hinzuzufügen, möchten Sie, dass diese Validierung jedes Mal ausgeführt wird, wenn das Modell gespeichert wird.
Ich weiß, wie man alles richtig zum Laufen bringt, ich suche nur nach einer Erklärung.
pre_save
Haken zu fangen undfull_clean
bei allen gefangenen Modellen zu tun .Antworten:
AFAIK, das liegt an der Abwärtskompatibilität. Es gibt auch Probleme mit ModelForms mit ausgeschlossenen Feldern, Modellen mit Standardwerten, pre_save () -Signalen usw.
Quellen, an denen Sie interessiert sein könnten:
quelle
Aus Gründen der Kompatibilität ist die automatische Bereinigung beim Speichern im Django-Kernel nicht aktiviert.
Wenn wir ein neues Projekt starten und möchten, dass die Standardmethode
save
für Modell automatisch bereinigt wird, können wir das folgende Signal verwenden, um eine Bereinigung durchzuführen, bevor jedes Modell gespeichert wurde.quelle
if send == somemodel, then exclude some fields
inpre_save_handler
ValidationError: Session with this Session key already exists
. Um dies zu vermeiden, müssen Sie eine if-Anweisung für hinzufügen, umsender in list_of_model_classes
zu verhindern, dass das Signal die Standardauthentifizierungsmodelle von Django überschreibt. Definierenlist_of_model_classes
Sie, wie Sie möchtenDer einfachste Weg, die
full_clean
Methode aufzurufen , besteht darin, diesave
Methode in Ihrem Verzeichnis zu überschreibenmodel
:quelle
Anstatt einen Code einzufügen, der einen Empfänger deklariert, können wir eine App als
INSTALLED_APPS
Abschnitt in verwendensettings.py
Zuvor müssen Sie möglicherweise
django-fullclean
PyPI installieren :quelle
pip install
eine App mit 4 Codezeilen verwenden (überprüfen Sie den Quellcode ), anstatt diese Zeilen selbst zu schreiben?Wenn Sie ein Modell haben, für das Sie sicherstellen möchten, dass es mindestens eine FK-Beziehung hat, und das Sie nicht verwenden möchten,
null=False
da hierfür eine Standard-FK festgelegt werden muss (bei der es sich um Mülldaten handelt), ist der beste Weg, den ich mir ausgedacht habe benutzerdefinierte.clean()
und.save()
Methoden hinzufügen ..clean()
Löst den Validierungsfehler aus und.save()
ruft die Bereinigung auf. Auf diese Weise wird die Integrität sowohl von Formularen als auch von anderen aufrufenden Codes, der Befehlszeile und Tests erzwungen. Ohne dies gibt es (AFAICT) keine Möglichkeit, einen Test zu schreiben, der sicherstellt, dass ein Modell eine FK-Beziehung zu einem speziell ausgewählten (nicht standardmäßigen) anderen Modell hat.quelle
Kommentar zu @Alfred Huangs Antwort und Kommentaren dazu. Sie können den pre_save-Hook für eine App sperren, indem Sie eine Liste von Klassen im aktuellen Modul (models.py) definieren und im pre_save-Hook dagegen prüfen:
quelle