根据一个表ID行从翻译表中获取所有翻译行

时间:2018-12-03 21:05:25

标签: python postgresql orm sqlalchemy

我有一张桌子来存储项目及其类型ID。 (我删除了不相关的部分。)

class Item(base):
    __tablename__ = 'Item'

    id = Column(Integer, primary_key = True, autoincrement = True)

    _type_translations = relationship('TypeTranslations', collection_class = attribute_mapped_collection('language_code'))

    type_name = association_proxy('_type_translations', 'translation', creator = lambda k, v: TypeTranslations(language_code = k, translation = v))

    type_id = Column(Integer, nullable = False)

session.add_all([Item(type_id = 2), Item(type_id = 1)])

然后我定义一个表,在其中存储这些类型ID的翻译以及它们的语言代码和翻译:

class TypeTranslations(base):
    __tablename__ = 'TypeTranslations'

    id = Column(Integer, primary_key = True, autoincrement = True)

    type_id = Column(Integer, nullable = False)

    language_code = Column(String, nullable = False)

    translation = Column(String, nullable = False)

这是TypeTranslations表的样子:

 id | type_id        | language_code | translation
----+----------------+---------------+-------------
  1 |              1 | en            | Type1
  2 |              2 | en            | Type2
  3 |              1 | es            | Tipo1
  4 |              2 | es            | Tipo2

我的问题是要建立一个与collection_class和association_proxy一起使用的关系,以便在查询Item时可以得到类似{'en:''Type1','es:''Tipo1'}的dict输出。 type_name我需要一个ForeignKey / ForeignKeyConstraint。但是,type_id可以在Item表中重复,并且如我上面所示,type_id也可以在TypeTranslations表中重复,然后需要一个唯一的约束,这在两个表中都没有。

我该如何设置它,以便在查询Item并访问它的type_name时,可以获得包含翻译的词典输出?例如,当查询type_id = 2的商品时,我会得到{'en:''Type2','es:''Tipo2'}作为输出?

0 个答案:

没有答案