Jestem po prostu ciekawy, czy ktoś wie, czy jest dobry powód, dla którego orm django nie wywołuje „full_clean” na modelu, chyba że jest on zapisywany jako część formularza modelu.
Zauważ, że full_clean () nie zostanie wywołana automatycznie po wywołaniu metody save () twojego modelu. Będziesz musiał wywołać to ręcznie, jeśli chcesz przeprowadzić jednoetapową weryfikację modelu dla własnych ręcznie utworzonych modeli. Pełny, czysty dokument django
(UWAGA: aktualizacja cytatu dla Django 1.6 ... poprzednie dokumenty django zawierały również zastrzeżenie dotyczące ModelForms.)
Czy istnieją dobre powody, dla których ludzie nie chcieliby takiego zachowania? Pomyślałem, że gdybyś poświęcił trochę czasu na dodanie walidacji do modelu, chciałbyś, aby weryfikacja była uruchamiana za każdym razem, gdy model jest zapisywany.
Wiem, jak sprawić, by wszystko działało poprawnie, szukam tylko wyjaśnienia.
pre_save
haczyk i zrobićfull_clean
na wszystkich złapanych modelach.Odpowiedzi:
AFAIK, jest to spowodowane wsteczną kompatybilnością. Występują również problemy z ModelForms z wykluczonymi polami, modelami z wartościami domyślnymi, sygnałami pre_save () itp.
Źródła, którymi możesz być zainteresowany:
źródło
Ze względu na zgodność, automatyczne czyszczenie przy zapisywaniu nie jest włączone w jądrze django.
Jeśli rozpoczynamy nowy projekt i chcemy, aby domyślna
save
metoda w modelu mogła wyczyścić się automatycznie, możemy użyć następującego sygnału, aby wyczyścić przed zapisaniem każdego modelu.źródło
if send == somemodel, then exclude some fields
dopre_save_handler
ValidationError: Session with this Session key already exists
. Aby tego uniknąć, musisz dodać instrukcję if dla,sender in list_of_model_classes
aby zapobiec nadpisywaniu przez sygnał domyślnych modeli uwierzytelniania Django. Zdefiniuj jaklist_of_model_classes
chceszNajprostszym sposobem wywołania
full_clean
metody jest po prostu przesłonięciesave
metody wmodel
:źródło
Zamiast wstawiać fragment kodu, który deklaruje odbiornik, możemy użyć aplikacji jako
INSTALLED_APPS
sekcji wsettings.py
Wcześniej może być konieczna instalacja
django-fullclean
za pomocą PyPI:źródło
pip install
jakąś aplikację z 4 wierszami kodu (sprawdź kod źródłowy ) zamiast pisać te wiersze samodzielnie?Jeśli masz model, który chcesz mieć pewność, że ma co najmniej jedną relację FK, a nie chcesz go używać,
null=False
ponieważ wymaga to ustawienia domyślnego FK (które byłyby danymi śmieciowymi), najlepszym sposobem, jaki wymyśliłem, jest aby dodać własne.clean()
i.save()
metody..clean()
podnosi błąd walidacji i.save()
wywołuje czysty. W ten sposób integralność jest wymuszana zarówno z formularzy, jak i z innego kodu wywołującego, wiersza poleceń i testów. Bez tego nie ma (AFAICT) sposobu na napisanie testu, który zapewni, że model ma relację FK z konkretnie wybranym (nie domyślnym) innym modelem.źródło
Komentując odpowiedź @Alfred Huang i komentuje ją. Można zablokować podpięcie pre_save do aplikacji, definiując listę klas w bieżącym module (models.py) i sprawdzając ją w zaczepie pre_save:
źródło