2017-10-06 4 views
1

je le modèle suivant:Aucune exception soulevée lors de l'enregistrement d'un champ vide avec null = False - Django

class User(models.Model): 
    email = models.EmailField(max_length=254, null=False, unique=True) 
    referral_code = models.CharField(max_length=10, null=False, unique=True) 

Et utilisé le shell Django pour sauver une instance d'utilisateur referral_code non défini:

u = User(email="[email protected]") 
u.save() 

Cela n'a pas déclenché une exception. Ma compréhension était que null = False exigerait que referral_code soit défini - N'est-ce pas le cas? Comment pourrais-je réaliser ce comportement?

mise à jour

Je remarque que le champ est réglé sur u.referral_code='', donc compte tenu de la contrainte d'unicité, ce qui a soulevé une exception quand j'ai essayé de répéter le processus avec une nouvelle instance. Je préférerais que l'exception soit levée car je n'ai pas défini le champ ...

Répondre

2

La valeur de votre referral_code n'est pas null, elle est '' (chaîne vide). Ceci est la valeur par défaut de CharField.

Mise à jour ainsi que des questions:

Vous pouvez soulever une erreur avant que les données sont stockées dans la base de données en remplaçant save sur le modèle

class User(models.Model): 
    email = models.EmailField(max_length=254, null=False, unique=True) 
    referral_code = models.CharField(max_length=10, null=False, unique=True) 

    def save(self, *args, **kwargs): 
     assert self.email, "The 'email' field must be populated." 
     super().save(*args, **kwargs) 

Il convient de noter que cela ne veut pas être préféré à la validation de formulaire si possible.