Установите поле модели как обязательное в Django - PullRequest
0 голосов
/ 19 июня 2020

Django не применяет NOT NULL на уровне модели / базы данных. В device_serial не должно быть ни пустого, ни пустого

class Device(models.Model):
       device_serial = models.CharField(max_length=36, unique=True, null=False, blank=False)
       ....etc

Приведенный ниже оператор работает совершенно нормально! Я ожидаю, что это не удастся, потому что требуется device_serial. Он не должен принимать пустую строку ''

Device.objects.create(device_serial='')

Как сделать поле обязательным на уровне модели / базы данных? Что я здесь делаю не так? Я не понимаю, где я go ошибся. Я пробовал '' .strp () преобразовать пустую строку в None, но это не сработало

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Что касается базы данных, она допускает только null / not null , который обрабатывается null=True/False и по умолчанию False. blank=True/False предназначен только для страницы администратора.

Строка '' не считается пустой, поэтому она принимается базой данных, когда у вас есть ограничение null=False.

Если вы хотите избежать пустых строк на уровне базы данных, вы можете переопределить save() в самой модели и вызвать исключение, когда device_serial установлен на пустую строку, например:

from django.core.exceptions import ValidationError

class Device(models.Model):
    device_serial = models.CharField(max_length=36, unique=True)

    def save(self, *args, **kwargs):
        if self.device_serial == '':
            raise ValidationError('device_serial cannot be empty')
        super().save(*args, **kwargs)

Теперь, когда вы пытаетесь создать объект с пустой строкой (которая вызывает save()), возникает следующее исключение:

django.core.exceptions.ValidationError: ['device_serial cannot be empty']
0 голосов
/ 20 июня 2020

Ответ Мохда сработал! В качестве альтернативы также работало ограничение проверки на уровне БД.

class Meta:
    constraints = [
        models.CheckConstraint(check=~models.Q(device_serial=''), name='chk_device_device_serial')
    ]
...