SqlAlchemy多语言支持

SqlAlchemy多语言支持,sqlalchemy,flask-sqlalchemy,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").

我有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_代码值传递给它,但我不知道如何传递。 并通过以下方式访问它:

result = Post.query.filter_by(author_id=1).pass_custom_var_to_all_posts_in_query(lang_code='en').paginate(page, 20, False)
或者,可能存在过滤子行的方法(并用当前语言显示一个标题,而不是所有标题的列表)

我将与一起使用

您的模型有些返工:

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']

最后,使用过滤器查询具有特定语言翻译的
标题

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

您的模型有些返工:

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']

最后,使用过滤器查询具有特定语言翻译的
标题

q = (
    session.query(Post)
    # .filter(Post.author_id == 1)
    .filter(Post.titles.contains('en'))
)
你可以用这个 此库将提供为每个模型创建转换表的功能,并获取本地化数据

您可以使用此库 此库将提供为每个模型创建转换表的功能,并获取本地化数据

1)您使用的数据库是什么?2) 当您进行查询时,是否只返回具有该语言标题翻译的帖子?例如,如果翻译不可用,则排除帖子?1)Postgresql 2)我希望返回所有具有正确翻译或默认语言(en)的帖子(如果翻译不可用1)您使用的数据库是什么?2) 当您进行查询时,是否只返回具有该语言标题翻译的帖子?例如,如果翻译不可用,则排除帖子?1)Postgresql 2)我希望返回所有具有正确翻译或默认语言(en)的帖子(如果翻译不可用)