Почему в Django моделях не используется обязательное поле модели, если оно не указано? - PullRequest
1 голос
/ 04 августа 2020

Я создал модель:

class Example(models.Model):
    name = models.CharField(max_length=50)
    code = models.CharField(max_length=10)
    content = models.TextField()

и соответствующий тест: from django .test import TestCase

from .models import Example


class ExampleTestCase(TestCase):
    def setUp(self):
        Example.objects.create(name="fff", content="blah blah blah")

    def test_length_of_toa_model(self):
        """example model should have length 1 as we created one in setUp"""
        length_of_toa = len(Example.objects.all())
        self.assertEqual(length_of_toa, 1)

Я помню поведение по умолчанию, которое выдает ошибку как Код по умолчанию является обязательным полем, а не пустым или пустым, так почему в этом случае все работает нормально? Также, помимо теста, я попытался создать и сохранить с помощью оболочки django, и она отлично работала.

1 Ответ

0 голосов
/ 04 августа 2020

, когда вы создаете объект менеджером (.objects), вы напрямую создаете запрос sql, поэтому у вас нет проверки полей. когда вы создаете / сохраняете объекты с помощью формы django, перед созданием формы проверьте все поля, запустив методы full_clean,

для обеспечения чистой проверки, вы можете добавить full_clean в save, например:

class MyModel(models.Model):
   ....

   def save(self, *args, **kwargs):
       self.full_clean() # if error(field cant blank ..ect) raise a ValidationError 
       super().save(*args, kwargs

вы также можете добавлять ограничения непосредственно в базе данных с помощью таких методов, как:

class MyModel(models.Model):
   username = models.TextField()
 
   class Meta:
        constraints = [
             models.CheckConstraint(check=Q(username__isnull=true), name='username_cant_be_empty')  # the username can be empty
        ]
        # when you save this with username empty, integrityError error raised,

подробнее здесь: https://docs.djangoproject.com/fr/3.0/ref/models/constraints/

...