Django: логическое поле со значением по умолчанию вызывает NotNullViolation в get_or_create - PullRequest
1 голос
/ 25 марта 2020

Я работаю над Django веб-приложением (с базой данных Postgres), которое содержит модель со следующим полем:

Loan(models.Model):
    (...)
    active = models.BooleanField(default=True)
    print_code = models.CharField(
        max_length=100,
        blank=True,
        null=True,
        unique=True,
    )
    (...)

Однако наше приложение в настоящее время вызывает ошибки Sentry на следующий фрагмент кода:

loan, created = Loan.objects.get_or_create(
   print_code=data['print_code']
)

Вызывает следующую ошибку:

null value in column "active" violates not-null constraint
DETAIL:  Failing row contains (null, null, null, null, print1722, f, null)

В трассировке также содержится ошибка Loan.DoesNotExist, поэтому я знаю, Django пытается создать новый экземпляр Loan - без указания значения для поля active, но, как видно из приведенного выше кода, он имеет значение по умолчанию.

Проблема в том, что до сих пор я не смог воспроизвести проблему локально, и у нас нет доступа оболочки к коду, который выполняется вживую. Все юнит-тесты также проходят без проблем, даже когда я явно создал несколько тестов для создания Loan объектов без поля active.

# Does not fail.
def test_null_value_on_active_field(self):
    test_object, created = Loan.objects.get_or_create(print_code='test')
    self.assertEqual(True, test_object.active)
    self.assertEqual(True, created)

Во всех моих попытках код работал как ожидалось и заполнял поле со значением по умолчанию True. И все же ошибка продолжает возникать, поэтому я должен что-то упустить.

Кто-нибудь знает, что мне не хватает?

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