Обновлено с 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, закрывать его соединение и заставлять его снова открываться и т.д. Но ничего не помогло.
Неужели мне не повезло с этим тестированием?