Je suis juste curieux de savoir s'il y a une bonne raison pour laquelle orm de django n'appelle pas 'full_clean' sur un modèle à moins qu'il ne soit enregistré dans le cadre d'un formulaire de modèle.
Notez que full_clean () ne sera pas appelé automatiquement lorsque vous appelez la méthode save () de votre modèle. Vous devrez l'appeler manuellement lorsque vous souhaitez exécuter la validation de modèle en une étape pour vos propres modèles créés manuellement. Doc propre complet de django
(NOTE: citation mise à jour pour Django 1.6 ... les précédents documents django avaient également une mise en garde concernant ModelForms.)
Y a-t-il de bonnes raisons pour lesquelles les gens ne voudraient pas ce comportement? Je pense que si vous preniez le temps d'ajouter une validation à un modèle, vous voudriez que cette validation soit exécutée à chaque fois que le modèle est enregistré.
Je sais comment tout faire fonctionner correctement, je cherche juste une explication.
pre_save
crochet et le fairefull_clean
sur tous les modèles capturés.Réponses:
AFAIK, c'est à cause de la rétrocompatibilité. Il y a aussi des problèmes avec ModelForms avec des champs exclus, des modèles avec des valeurs par défaut, des signaux pre_save (), etc.
Sources qui pourraient vous intéresser:
la source
En raison de la compatibilité, le nettoyage automatique à la sauvegarde n'est pas activé dans le noyau django.
Si nous commençons un nouveau projet et que nous voulons que la
save
méthode par défaut sur Model puisse nettoyer automatiquement, nous pouvons utiliser le signal suivant pour effectuer un nettoyage avant que chaque modèle ne soit enregistré.la source
if send == somemodel, then exclude some fields
àpre_save_handler
ValidationError: Session with this Session key already exists
. Pour éviter cela, vous devez ajouter une instruction if poursender in list_of_model_classes
empêcher le signal de remplacer les modèles d'authentification par défaut de Django. Définissezlist_of_model_classes
comme vous le souhaitezLe moyen le plus simple d'appeler la
full_clean
méthode consiste simplement à remplacer lasave
méthode dans votremodel
:la source
Au lieu d'insérer un morceau de code qui déclare un récepteur, nous pouvons utiliser une application comme
INSTALLED_APPS
section danssettings.py
Avant cela, vous devrez peut-être installer à l'
django-fullclean
aide de PyPI:la source
pip install
une application avec 4 lignes de code (vérifiez le code source ) au lieu d'écrire ces lignes vous-même?Si vous avez un modèle dont vous voulez vous assurer qu'il a au moins une relation FK, et que vous ne voulez pas utiliser
null=False
parce que cela nécessite la définition d'un FK par défaut (qui seraient des données inutiles), la meilleure façon que j'ai trouvée est pour ajouter de la personnalisation.clean()
et des.save()
méthodes..clean()
lève l'erreur de validation et.save()
appelle le fichier clean. De cette façon, l'intégrité est appliquée à la fois à partir des formulaires et à partir d'autres codes d'appel, de la ligne de commande et des tests. Sans cela, il n'y a (AFAICT) aucun moyen d'écrire un test qui garantit qu'un modèle a une relation FK avec un autre modèle spécifiquement choisi (pas par défaut).la source
Commenter la réponse de @Alfred Huang et commenter. On peut verrouiller le hook pre_save sur une application en définissant une liste de classes dans le module actuel (models.py) et en la comparant dans le hook pre_save:
la source