Django Test Fails with OperationalError on Tenant Deletion in Multi-Tenant PostgreSQL Setup

Я столкнулся со специфической проблемой при выполнении тестовых примеров в проекте Django, который включает в себя многопользовательскую установку базы данных PostgreSQL. Процесс, который я тестирую, заключается в удалении арендаторов, и примечательно, что эта ошибка появляется только во время тестов, в то время как реальное приложение работает без каких-либо проблем при реальном запуске.

Сообщения об ошибках: Во время выполнения теста я получаю две ошибки в последовательности:

django.db.utils.OperationalError: cannot DROP TABLE "model_name_1" because it has pending trigger events

django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block

Подробный контекст: Проблема проявляется при запуске Django-теста, проверяющего удаление арендатора и связанных с ним данных. В частности, ошибки возникают в строке, где арендатор удаляется с помощью tenant.delete(force_drop=True). В тестовом примере устанавливаются данные для моделей, включающих отношения внешних ключей, и именно при этих условиях наблюдаются ошибки:

def test_tenant_deletion(tenant, monkeypatch):
    with tenant_context(tenant):
        model_1.objects.create(name="Test date", process_id="process")
        model_2.objects.create(name="Test date", model_1=model_1.objects.first())
    
    payload = {
        "eventId": "abcdef",
        "type": "DELETED",
        "tenant": {"tenantId": str(tenant.id)},
    }
    
    event = Mock(link=Mock(source=Mock(address="delete_tenant")), message=Mock(body=json.dumps(payload)))

    listener = Listener(URL, USER, PASSWORD)
    listener.on_message(event)

    assert not Tenant.objects.filter(id=tenant.id).exists()

Наблюдения:

  • Операция tenant.delete(force_drop=True) проходит без ошибок в реальном запуске.
  • Ошибки характерны для среды тестирования, особенно когда тестовые данные включают ограничения по внешним ключам.

Примечание: я использую Pytest

Я попробовал использовать transaction.atomic(): и затем transaction.commit(), но получаю ошибку

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