Où devrais-la validation du modèle de champs d' aller dans django?
Je pourrais en nommer au moins deux choix possibles: dans la surcharge .méthode save() du modèle ou dans la .to_python() la méthode des modèles.Champ de sous-classe (évidemment, pour que cela fonctionne vous devez écrire des champs personnalisés).
Les cas d'utilisation possibles:
- lorsque c'est absolument nécessaire afin d'assurer, d'une chaîne vide n'a pas obtenir de l'écrit dans la base de données (vide=False argument mot-clé ne fonctionne pas ici, c'est pour la validation d'un formulaire uniquement)
- lorsqu'il est nécessaire de s'assurer, que les "choix" argument mot-clé obtient le respect sur un db-niveau, et pas seulement dans l'interface d'administration (genre de l'émulation d'un enum type de données)
Il y a aussi un niveau de classe de l'attribut empty_strings_allowed
dans les modèles.Champ de la base de la définition de la classe et les classes dérivées heureux de le remplacer, mais il ne semble pas pour produire un effet sur le niveau de base de données, ce qui signifie que je peut toujours construire un modèle avec vide-champs de type chaîne et l'enregistrer dans la base de données. Je veux éviter (oui, c'est nécessaire).
Implémentations possibles sont
sur le terrain:
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
raise IntegrityError(_('Empty string not allowed'))
return models.CharField.to_python(self, value)
sur le modèle de niveau:
class MyModel(models.Model)
FIELD1_CHOICES = ['foo', 'bar', 'baz']
field1 = models.CharField(max_length=255,
choices=[(item,item) for item in FIELD1_CHOICES])
def save(self, force_insert=False, force_update=False):
if self.field1 not in MyModel.FIELD1_CHOICES:
raise IntegrityError(_('Invalid value of field1'))
# this can, of course, be made more generic
models.Model.save(self, force_insert, force_update)
Peut-être, je suis en manque de quelque chose et cela peut être fait plus facile (et plus propre)?