Django-parler получает переводы из неправильной базы данных
Я большой поклонник Django-parler, но я столкнулся с проблемой при хранении переведенной модели в двух разных базах данных.
Моя модель:
class InstrumentFamily(TranslatableModel):
primary_key = True
translations = TranslatedFields(
label=CharNullField(_('Label'), max_length=100, unique=False, null=True,)
У меня есть 2 псевдонима базы данных 'default' и 'test', и мой маршрутизатор базы данных направляет мою модель на 'test'.
Я вставляю модели в обе базы данных, делая следующее:
fam = InstrumentFamily(code=TEST_CODE)
with switch_language(fam, 'en'):
fam.label = "test_family_test EN"
with switch_language(fam, 'fr'):
fam.label = "test_family_test FR"
fam.save()
который хранит объект и его переводы в базе данных 'test', или сделав следующее:
fam = InstrumentFamily(code="TEST_FAM")
with switch_language(fam, 'en'):
fam.label = "test_family_default_EN"
with switch_language(fam, 'fr'):
fam.label = "test_family_default_FR"
fam.save(using='default')
, который сохраняет объект и его переводы в базе данных 'default'. Пока все в порядке.
Но при обращении к объекту, ранее сохраненному в 'default', делая следующее (после правильной очистки всех кэшей для принудительного чтения базы данных):
fam = InstrumentFamily.objects.using('default').get(code=TEST_CODE)
print(f" label: {fam.label}")
django-parler правильно извлекает объект из базы данных 'default', но ищет перевод из базы данных 'test' (трассировка SQL ниже, смотрите самый конец каждой строки):
SELECT "orchestra_instrumentfamily"."id", "orchestra_instrumentfamily"."code" FROM "orchestra_instrumentfamily" WHERE "orchestra_instrumentfamily"."code" = 'TEST_FAM' LIMIT 21; args=('TEST_FAM',); alias=default
SELECT "orchestra_instrumentfamily_translation"."id", "orchestra_instrumentfamily_translation"."language_code", "orchestra_instrumentfamily_translation"."label", "orchestra_instrumentfamily_translation"."master_id" FROM "orchestra_instrumentfamily_translation" WHERE ("orchestra_instrumentfamily_translation"."master_id" = 34 AND "orchestra_instrumentfamily_translation"."language_code" = 'en') LIMIT 21; args=(34, 'en'); alias=test
Я явно упускаю что-то важное... Что я должен сделать, чтобы информация 'using("default")' распространилась на второй запрос? Я не смог найти в документации ничего о хранении TranslatableModels в более чем одной базе данных.
Заранее спасибо за просвещение!
Похоже, что это ошибка в django-parler. Он не передает информацию using
своим внутренним запросам, которые получают данные модели перевода. Вы можете подать бит в репозиторий GitHub, чтобы это было исправлено.
Обходным решением может быть реализация маршрутизатора базы данных, который принудительно использует определенную базу данных для данной модели.