Многоязычные текстовые поля с помощью SQLAlchemy - PullRequest
0 голосов
/ 11 февраля 2012

В настоящее время я оцениваю SQLAlchemy для проекта. Вот моя схема:

  • таблица ЯЗЫК, со строкой для каждого поддерживаемого языка
  • таблица перевода с (ID, LANGUAGE_ID, STR)
  • различные таблицы вместо хранения текста будут хранить TRANSLATION_IDs, например, BOOK (ID, TITLE_TRANSLATION_ID, ABSTRACT_TRANSLATION_ID)

Теперь, предполагая, что у каждого запроса есть текущий идентификатор языка (например, через переменную потока ...), мне понадобится SQLAlchemy, чтобы автоматически присоединиться к таблице TRANSLATION и, таким образом, иметь текстовые поля на текущем языке. Что-то вроде:

class Book(Base):
    id = Column(Integer, primary_key=True)
    title = TranslatableText()
    abstract = TranslatableText()

При извлечении ORM автоматически присоединится к таблице ПЕРЕВОД с текущим языковым идентификатором, а my_book.title выдаст мне заголовок на текущем языке.

Мне также нужно это для работы с отношениями: если класс содержит внешние ключи к другим классам, которые также содержат переводимые текстовые поля, я в идеале хотел бы, чтобы они также были получены.

Наконец, мне также необходимо иметь возможность получить TRANSLATION_ID для каждого поля, например, через my_book.title_translation_id.

Я не ожидаю полного решения, но я хотел бы знать, возможно ли что-то подобное и с чего начать.

1 Ответ

0 голосов
/ 14 февраля 2012

Вы должны использовать концепцию http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative.html#mixin-and-custom-base-classes

Создайте один класс верхнего уровня и напишите некоторые функции, такие как чтение, запись и создание. Всегда вызывайте эту функцию для создания или чтения данных из базы данных.

Если вы не хотите реализовывать классы mixin, вы также можете использовать событие http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.MapperEvents.translate_row

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...