0

例如,有这样的模型:

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

但是在最后一个模型中,User与 andGroup的关系并不好,因为在一种情况下,第一个关系将是 None,而在另一种情况下,第二个关系将是 None(因为照片所有者只能是用户或组,但不能同时是两者)......如果有使用外键建模的模型超过 2 个Photo- 情况会更糟。如何正确处理这种关系?

提前致谢!

4

3 回答 3

1

如果您的 User 和 Group 没有存储在同一个表中,那么用两个关系定义它们并没有错。这两个关系意味着两个不同的 SQL 查询,您的情况实际上需要这两个不同的查询。

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

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

于 2012-06-23T15:55:21.860 回答
1

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

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

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

语法与 SQLAlchemy 不同,但您可以了解主要思想。

于 2012-07-01T11:45:36.427 回答
0

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

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

于 2012-06-25T15:59:10.027 回答