Совершенно так же, как Тестовый пример Django, дающий непоследовательные ответы, кеширование или виновник транзакции? , у меня непоследовательное поведение из базы данных во время юнит-тестов.
Точнее,тестовый класс с ошибками выглядит следующим образом:
- во время настройки , запускается создание экземпляра сигнала модели
- для этой модели и заполняется полев SQL (
cursor.execute...
) - в конце функции сигнала , я проверяю, что поле заполнено -> нет проблем, все работает отлично
- следующая строка в настройке , я перезагружаю модель из базы данных и проверяю поле -> нет значения
Я действительно в растерянности, так что если у кого-то есть идеио том, что происходит, не стесняйтесь поделиться;)
РЕДАКТИРОВАТЬ: вот соответствующие части кода
# my_app/models.py
class MyModel(Model):
name = CharField(max_length=50)
search = SearchVectorField(blank=True, null=True)
# my_app/signals.py
@receiver(post_save, sender=MyModel)
def update_search(sender, instance, **kwargs):
print("Search field before", MyModel.objects.get(pk=instance.id).search)
with connection.cursor() as cursor:
cursor.execute("""
UPDATE myapp_mymodel AS mb
SET search = to_tsvector('simple'::regconfig, mb.name)
WHERE mb.id = {};
""".format(instance.id))
print("Search field", MyModel.objects.get(pk=instance.id).search)
time.sleep(5)
print("Search field later", MyModel.objects.get(pk=instance.id).search)
# my_app/tests.py
class MyModelTests(APITestCase):
@classmmethod
def setUpClass(cls):
cls.item = MyModel.objects.create(name=FAKER.name(max_nb_chars=50))
cls.item.refresh_from_db()
print("Search field just after creation", MyModel.objects.get(pk=cls.item.id).search)
Я получаю следующий вывод:
Search field before None #alright
Search field 'adélaïde':1 'moreno':2 #update works
Search field later 'adélaïde':1 'moreno':2 #reloading slightly later, out of despair, still works
Search field just after creation None # reloading from the setUpClass method doesn't work