作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Rails 项目中的数据库,并尝试在其上构建 Flask 应用程序。
其中有一些多态关联,我无法弄清楚如何使用 Flask-SQLAlchemy 进行复制。
例如,有一个“照片”模型,其属性为 id
、url
、photoable_id
、photoable_type
,它可能属于艺术家
、组织
或事件
。在我拥有的数据库中,Artist
、Organization
和 Event
表没有对照片的引用。
我找到了this approach对于 SQLAlchemy 中的多态关联,但它需要创建一个关联表 - 有没有办法按原样使用模式来做到这一点?
最佳答案
我正在寻找的是 outlined here .
以下是一对多关系的示例:
from app import db
from datetime import datetime
from sqlalchemy import event, and_
from sqlalchemy.orm import relationship, foreign, remote, backref
class HasPhotos():
pass
class Photo(db.Model):
__tablename__ = 'photos'
id = db.Column(db.Integer(), primary_key=True)
image = db.Column(db.String())
photoable_id = db.Column(db.Integer())
photoable_type = db.Column(db.String(50))
created_at = db.Column(db.DateTime(), default=datetime.utcnow)
updated_at = db.Column(db.DateTime(), default=datetime.utcnow)
@property
def parent(self):
return getattr(self, 'parent_{}'.format(self.photoable_type))
@event.listens_for(HasPhotos, 'mapper_configured', propagate=True)
def setup_listener(mapper, class_):
name = class_.__name__
type = name.lower()
class_.photos = relationship(Photo,
primaryjoin=and_(
class_.id == foreign(remote(Photo.photoable_id)),
Photo.photoable_type == type
),
backref=backref(
'parent_{}'.format(type),
primaryjoin=remote(class_.id) == foreign(Photo.photoable_id)
)
)
@event.listens_for(class_.photos, 'append')
def append_photo(target, value, initiator):
value.photoable_type = type
然后在定义具有这种关系的类时,只需继承HasPhotos
,例如
class Artist(HasPhotos, db.Model):
pass
要建立一对一关系,只需将关键字参数 uselist=False
添加到 relationship()
调用中,而不是监听 append
事件,监听 set
事件,例如:
@event.listens_for(class_.photo, 'set')
def set_photo(target, value, old_value, initiator):
value.photoable_type = type
关于python - SQLAlchemy 中的多态所属关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33657356/
我是一名优秀的程序员,十分优秀!