Не возникает исключение при сохранении пустого поля с 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)

И использовал оболочку Django для сохранения пользовательского экземпляра с неопределенным ссылочным кодом:

u = User(email="test@example.com")
u.save()

Это не стало исключением. Насколько я понимаю, что null=False потребует установки referral_code - разве это не так? Как бы я достиг такого поведения?

Обновить

Я заметил, что поле установлено в u.referral_code=''Поэтому, учитывая ограничение уникальности, это вызвало исключение, когда я попытался повторить процесс с новым экземпляром. Я бы предпочел, чтобы исключение было брошено, потому что я не установил поле...

1 ответ

Решение

Ценность вашего referral_code не является null, это '' (пустая строка). Это по умолчанию CharField,

Обновлено вместе с вопросом:

Вы можете вызвать ошибку, прежде чем данные будут сохранены в базе данных, переопределив save на модели

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)

Следует отметить, что это не должно быть предпочтительным по сравнению с проверкой формы, где это возможно.

Другие вопросы по тегам