Почему django не нужны все поля для тестирования модели - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть модель, подобная этой:

class CreateDeal(models.Model):
    name = models.CharField(max_length=100)
    fuel = models.CharField(max_length=15)
    mileage = models.PositiveIntegerField(db_index=True)
    phone_number = models.CharField(max_length=17) 
    location = models.CharField(max_length=100, db_index=True)
    car_picture = models.ImageField(upload_to='car_picture')
    description = models.TextField()
    price = models.PositiveSmallIntegerField(db_index=True)
    available = models.BooleanField(default=True)
    created_on = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

, и у меня есть тестовый класс для тестирования модели выше, как это:

class CreateDealTest(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            username='alfa', email='alfa@hotmail.com', password='top_secret'
        )
        self.deal = CreateDeal.objects.create(
            name='deal1', mileage=100, price=25, user=self.user
        )

    def test_deal_name(self):
        deal = CreateDeal.objects.get(name='deal1')
        expected_deal_name = f'{self.deal.name}'
        self.assertAlmostEqual(expected_deal_name, str(deal))

, если я запускаю тест, у меня есть:

Ran 1 test in 0.166s

OK

Мой вопрос заключается в том, почему django не вызывает исключение, так как почти все поля в моей модели являются обязательными. И что я не понимаю, так это если я удаляю одно поле Createdeal в моем setUp (например, пробег, цена, пользователь или имя), у меня появляется ошибка.

Например, если я удаляю mileage, У меня есть эта ошибка:

повышение utils.IntegrityError (* tuple (e.args))

django .db.utils.IntegrityError: (1048, "Столбец «пробег» не может быть нулевым »)

1 Ответ

2 голосов
/ 25 февраля 2020

Charfield, Imagefield и Textfield могут быть пустой строкой, которая действительна на уровне базы данных, некоторые из ваших полей имеют значения по умолчанию, поэтому они будут записаны, если не установлены, что делает их также действительными на уровне базы данных.

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

Параметр blank=False по умолчанию применяется только на уровне проверки, но не на уровне базы данных. Это означает, что если вы назовете full_clean() на вашей модели, это повысит ValidationError. Но ничто не мешает вам сохранить недопустимую модель (save() не вызывает full_clean(), как объяснено здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...