Tengo curiosidad por saber si alguien sabe si hay una buena razón por la cual el orm de django no llama 'full_clean' en un modelo a menos que se guarde como parte de un formulario de modelo.
Tenga en cuenta que no se llamará automáticamente a full_clean () cuando llame al método save () de su modelo. Deberá llamarlo manualmente cuando desee ejecutar la validación de modelo de un solo paso para sus propios modelos creados manualmente. el documento completo de django
(NOTA: la cita actualizada para Django 1.6 ... los documentos anteriores de django también tenían una advertencia sobre ModelForms).
¿Hay buenas razones por las cuales la gente no querría este comportamiento? Creo que si se tomara el tiempo de agregar validación a un modelo, desearía que esa validación se ejecute cada vez que se guarde el modelo.
Sé cómo hacer que todo funcione correctamente, solo estoy buscando una explicación.
pre_save
gancho y hacerlofull_clean
en todos los modelos atrapados.Respuestas:
AFAIK, esto se debe a la compatibilidad con versiones anteriores. También hay problemas con ModelForms con campos excluidos, modelos con valores predeterminados, señales pre_save (), etc.
Fuentes en las que podría estar interesado:
fuente
Debido a la compatibilidad que se considera, la limpieza automática al guardar no está habilitada en el núcleo de django.
Si estamos comenzando un nuevo proyecto y queremos que el
save
método predeterminado en el Modelo se pueda limpiar automáticamente, podemos usar la siguiente señal para limpiar antes de guardar cada modelo.fuente
if send == somemodel, then exclude some fields
enpre_save_handler
ValidationError: Session with this Session key already exists
. Para evitar esto, debe agregar una instrucción if parasender in list_of_model_classes
evitar que la señal anule los modelos de autenticación predeterminados de Django. Definelist_of_model_classes
como elijasLa forma más sencilla de llamar al
full_clean
método es simplemente anular elsave
método en sumodel
:fuente
En lugar de insertar un fragmento de código que declara un receptor, podemos usar una aplicación como
INSTALLED_APPS
sección ensettings.py
Antes de eso, es posible que necesite instalar
django-fullclean
usando PyPI:fuente
pip install
alguna aplicación con 4 líneas de código (verifique el código fuente ) en lugar de escribir estas líneas usted mismo?Si tiene un modelo que desea garantizar que tenga al menos una relación FK, y no desea usarlo
null=False
porque eso requiere establecer un FK predeterminado (que sería información basura), la mejor manera que he encontrado es para agregar personalizados.clean()
y.save()
métodos..clean()
plantea el error de validación y.save()
llama a la limpieza. De esta forma, la integridad se aplica tanto desde los formularios como desde otro código de llamada, la línea de comandos y las pruebas. Sin esto, (AFAICT) no hay forma de escribir una prueba que garantice que un modelo tenga una relación FK con otro modelo elegido específicamente (no predeterminado).fuente
Comentando la respuesta de @Alfred Huang y sus comentarios. Uno podría bloquear el enlace pre_save en una aplicación definiendo una lista de clases en el módulo actual (models.py) y verificando en el enlace pre_save:
fuente