SQLAlchemy:如何在几个模型之间建立关系?

时间:2012-06-23 14:50:51

标签: python sqlalchemy

例如,有这样的模型:

class User(Base):
    photo_id = Column(ForeignKey('photo.id'))

class Group(Base):
    photo_id = Column(ForeignKey('photo.id'))

class Photo(Base):
    __tablename__ = 'photo'

    user = relationship('User', backref='photo')
    group = relationship('Group', backref='photo')

但是在最后一个模型中与UserGroup的关系并不好,因为在一种情况下,第一个关系将是None,而在其他情况下,第二个关系将是None(因为照片所有者只能是用户或小组,但不是两个)...如果有超过2个模型与外国钥匙模型Photo - 情况会更糟。 怎么做这种关系正确?

提前致谢!

3 个答案:

答案 0 :(得分:1)

如果您的用户和组未存储在同一个表中,则使用两个关系定义它们没有任何错误。这两个关系意味着两个不同的SQL查询, 在你的情况下,你实际上需要这两个不同的查询。

如果您的用户和组可以存储在同一个表中,则可以使用继承。 并创建一个与父表的关系 http://docs.sqlalchemy.org/en/latest/orm/inheritance.html

或为其创建视图 http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#reflecting-views

答案 1 :(得分:1)

使用表继承:http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/declarative.html#joined-table-inheritance

我向您推荐这张幻灯片:http://www.slideshare.net/tyler4long/quickorm。它是关于quick_orm,它基于SQLAlchemy。您将看到如何通过表继承解决相同的问题。

幻灯片7:许多模型应该与“评论”有关系 幻灯片8:添加一个名为“Commentable”的父类来解决问题。

语法与SQLAlchemy不同,但您可以获得主要想法。

答案 2 :(得分:0)

我认为没有一种正确的方法来建模这种关系。基数,导航性也是需要考虑的事实。

对于与建模问题非常相似的解决方案,请参阅Generic Associations示例。这些例子起初可能看起来有点复杂,但是如果你在Polymorphic Associations with SQLAlchemy上阅读迈克的博客,应该很清楚那里发生了什么。您最终会得到一些不同的模型,并且通过单个属性(Photoparent)从owner导航回正确的父级可能无法实现,但您是否真的需要导航从Photo那边的关系?