Модель Django возвращает count() 0, но вызывает ошибку IntegrityError при одиночной записи bulk_create/save в тестовом примере

У меня есть тестовый пример для пересчета значений в моей базе данных.

Поток:

  1. Инициальный расчет ( записи добавлены в несколько моделей/таблиц)
  2. Сброс данных (удаление связанных вычисленных данных)
  3. Re-calculate (записи добавлены в несколько моделей/таблиц)

Итак, мой тестовый пример выглядит примерно так:

assert DataModel1.objects.count() == 0
assert DataModel2.objects.count() == 0

plan = prepare_plan()
calculation_manager = CalculationManager()

# initial calculation
calculation_manager.schedule(plan)

# confirm data populated
self.assertTrue(DataModel1.objects.count())
self.assertTrue(DataModel2.objects.count())

perform_reset(plan)

# confirm data deleted
assert DataModel1.objects.count() == 0
assert DataModel2.objects.count() == 0

# re-calculate
calculation_manager.schedule(plan)

При попытке пересчета calculation_manager.schedule(plan) возникает IntegrityError - duplicate key value violates constraint ошибка для DataModel2 на bulk_create, несмотря на удаление и подтверждение DataModel2.objects.count() == 0 и подтверждение того, что bulk_create передается только одна запись.

(Также попробовал заменить bulk_create на save и результат был тот же)

Внутри функции perform_reset(plan) и функций/методов calculation_manager.schedule(plan) находятся блоки atomic(), в которых результаты фиксируются в базе данных или элементы удаляются.

--

Я пробовал переключаться между использованием TestCase/TransactionTestCase без разницы в результатах.

Я обнаружил, что выполнение ручного усечения таблицы SQL после perform_reset(plan) приводит к тому, что тест-кейс выполняется, как и ожидалось, но это не должно быть необходимо.

Почему при выполнении delete в тесткейсе и возвращении значения 0 django выбрасывает ошибку IntegrityError, как будто удаленное значение осталось в базе данных? Может быть, он не полностью удаляет объекты из таблиц во время тестовых примеров?

Вернуться на верх