SqlAlchemy多语言支持

时间:2016-01-26 23:16:37

标签: sqlalchemy flask-sqlalchemy

我有SqlAlchemy的下一个模型:

class Post(db.Model):
    __tablename__ = 'posts'

    post_id = db.Column(db.Integer, primary_key=True)
    created_at = db.Column(db.DateTime)

# I dont want list of all title translations: titles = db.relationship("Content"). 
# How can I pass lang_code here for properly title value?
    title = db.relationship("Content",
                            primaryjoin="and_(Content.post_id==Post.post_id,
                            Content.lang_code=='%s')" % lang_code, uselist=False)
class Content(db.Model):
    __tablename__ = 'content'
    content_id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.String())
    lang_code = db.Column(db.String(2)) # for ex: 'en', 'fr', 'de', 'ru'
    post_id = db.Column(db.Integer, db.ForeignKey('posts.post_id'))

我希望发布包含' en'没有我的代码中所有翻译列表的标题。我想将lang_code值传递给它,但我不知道如何。 并使用以下内容访问它:

result = Post.query.filter_by(author_id=1).pass_custom_var_to_all_posts_in_query(lang_code='en').paginate(page, 20, False)

或者,可能存在过滤子行的方法(并用当前语言显示一个标题而不是所有标题的列表)

2 个答案:

答案 0 :(得分:1)

我会将Association Proxyattribute_mapped_collection一起使用。

你的模特有些重做:

class Post(Base):
    __tablename__ = 'posts'
    post_id = Column(Integer, primary_key=True)
    name = Column(String) 
    created_at = Column(DateTime)

    _titles = relationship(
        "Content",
        collection_class=attribute_mapped_collection("lang_code"),
    )

    titles = association_proxy(
        '_titles', 'lang_code',
        creator=lambda k, v: Content(lang_code=k, value=v),
    )


class Content(Base):
    __tablename__ = 'content'
    content_id = Column(Integer, primary_key=True)
    value = Column(String())
    lang_code = Column(String(2))  # for ex: 'en', 'fr', 'de', 'ru'
    post_id = Column(Integer, ForeignKey('posts.post_id'))

然后您可以创建Post个实例:

p = Post(
    name="no english",
    titles={
        'de': 'liebe',
        'es': 'amor',
    },
)
session.add(p)

添加/更新很简单,只需p.titles['it'] = 'amore',并删除为del p.titles['it']

最后,您的Title过滤器的查询已翻译为特定语言:

q = (
    session.query(Post)
    # .filter(Post.author_id == 1)
    .filter(Post.titles.contains('en'))
)

答案 1 :(得分:0)

您可以使用此https://sqlalchemy-i18n.readthedocs.io/en/latest/ 该库将使您能够为每种模型创建用于翻译的表格并获取本地化数据