Обновлено с Django 3.2 до 5.2, теперь я получаю сообщение "Запрос на соответствие Obj не существует".

Я использую Django в проекте, не относящемся к Django (под капотом Postgresql 17), исключительно для упрощения модульных тестов. Я определил все свои модели следующим образом:

class Bar(models.Model):
    internal_type = models.TextField(...)
    ...
   
    class Meta:
        managed = False
        db_table = 'myschema\".\"bar'      

class Foo(models.Model):
    ...
    bar = models.ForeignKey('Bar', models.DO_NOTHING, db_column='bar', blank=True, null=True)
 
   class Meta:
        managed = False
        db_table = 'myschema\".\"foo'      

Это выглядит странно, но в Django 3.2 все работало отлично. Это позволило мне писать тесты, подобные этому:

def test_foo(self):
    from app import models

    assert models.Foo.objects.count() == 0

    # self.cursor is a psycopg2 cursor
    # run_planner uses that cursor to create a bunch of Foo and related Bar objects
    run_planner(self.cursor)
    self.cursor.connection.commit()

    my_foos = models.Foo.objects.filter(bar__internal_type='special')
    
    assert my_foos.count() == 2 # this passes

    for m in my_foos:
        print(m.bar) # this raises DoesNotExist

Этот тест прошел без проблем в Django 3.2, но в последней строке в 5.2 произошел сбой. Как я могу это обойти? Похоже, что Django использует некоторую более строгую изоляцию транзакций за кулисами? Как может .count() выполняться успешно, но доступ к нему завершиться неудачей? Обратите внимание, что my_foos специально запрашивает Foo объектов со связанными Bar экземплярами.

Я уже пробовал фиксировать курсор Django, закрывать его соединение и заставлять его снова открываться и т.д. Но ничего не помогло.

Неужели мне не повезло с этим тестированием?

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