我有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)
或者,可能存在过滤子行的方法(并用当前语言显示一个标题而不是所有标题的列表)
答案 0 :(得分:1)
我会将Association Proxy与attribute_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/ 该库将使您能够为每种模型创建用于翻译的表格并获取本地化数据