Estou curioso para saber se alguém sabe se há uma boa razão pela qual o orm do django não chama 'full_clean' em um modelo, a menos que esteja sendo salvo como parte de um formulário de modelo.
Observe que full_clean () não será chamado automaticamente quando você chamar o método save () do seu modelo. Você precisará chamá-lo manualmente quando desejar executar a validação de modelo em uma etapa para seus próprios modelos criados manualmente. doc limpo completo do django
(NOTA: a cotação atualizada para o Django 1.6 ... os documentos anteriores do django também tinham uma advertência sobre o ModelForms.)
Existem boas razões para as pessoas não quererem esse comportamento? Eu acho que se você reservasse algum tempo para adicionar validação a um modelo, desejaria que a validação fosse executada toda vez que o modelo for salvo.
Eu sei como fazer tudo funcionar corretamente, só estou procurando uma explicação.
pre_save
gancho e fazerfull_clean
em todos os modelos capturados.Respostas:
AFAIK, isso ocorre devido à compatibilidade com versões anteriores. Também há problemas com ModelForms com campos excluídos, modelos com valores padrão, sinais pre_save () etc.
Fontes nas quais você pode se interessar:
fonte
Por causa da compatibilidade, a limpeza automática ao salvar não é ativada no kernel do django.
Se estamos iniciando um novo projeto e queremos que o
save
método padrão no Model seja limpo automaticamente, podemos usar o seguinte sinal para fazer a limpeza antes de cada modelo ser salvo.fonte
if send == somemodel, then exclude some fields
empre_save_handler
ValidationError: Session with this Session key already exists
. Para evitar isso, você precisa adicionar uma instrução if parasender in list_of_model_classes
evitar que o sinal substitua os modelos de autenticação padrão do Django. Definalist_of_model_classes
como quiserA maneira mais simples para chamar o
full_clean
método é apenas para substituiçãosave
método na suamodel
:fonte
Em vez de inserir um pedaço de código que declara um receptor, podemos usar um aplicativo como
INSTALLED_APPS
seção emsettings.py
Antes disso, você pode precisar instalar
django-fullclean
usando o PyPI:fonte
pip install
algum aplicativo com quatro linhas de código (verifique o código-fonte ) em vez de escrever essas linhas?Se você tem um modelo que deseja garantir que tenha pelo menos um relacionamento FK e não deseja usá-lo,
null=False
porque isso requer a configuração de um FK padrão (que seria dados de lixo), a melhor maneira de criar isso é para adicionar métodos.clean()
e customizados.save()
..clean()
gera o erro de validação e.save()
chama a limpeza. Dessa forma, a integridade é imposta a partir de formulários e de outro código de chamada, linha de comando e testes. Sem isso, (AFAICT) não há como escrever um teste que garanta que um modelo tenha uma relação FK com outro modelo escolhido (não padrão).fonte
Comentando a resposta de @Alfred Huang e comentários sobre ela. Pode-se bloquear o gancho pre_save em um aplicativo, definindo uma lista de classes no módulo atual (models.py) e comparando-o no gancho pre_save:
fonte