python - SQLAlchemy 中的多态所属关系?

标签 python sqlalchemy flask-sqlalchemy

我正在使用 Rails 项目中的数据库,并尝试在其上构建 Flask 应用程序。

其中有一些多态关联,我无法弄清楚如何使用 Flask-SQLAlchemy 进行复制。

例如,有一个“照片”模型,其属性为 idurlphotoable_idphotoable_type,它可能属于艺术家组织事件。在我拥有的数据库中,ArtistOrganizationEvent 表没有对照片的引用。

我找到了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/

相关文章:

python - 在 Pyramid 框架中实现 Sqlalchemy 烧杯缓存

python - 使用多个表中的数据的唯一约束(SQL/SQLAlchemy)

python - 为每个用户提供自己的数据库

sqlalchemy - Alembic:如何向现有列添加唯一约束

python - 如何使用数据库在 Django 中的应用程序之间交换数据?

python - LOAD DATA LOCAL INFILE sqlalchemy 和 python 到 mysql 数据库

python - SQLAlchemy:唯一约束失败错误,但未设置唯一约束

amazon-web-services - 无法通过来自 Python Elastic Beanstalk 的 Flask SQLAlchemy URI 连接到 AWS MySQL RDS 实例

python - 安装 python shapely 时出现 Alpine 错误

Python:写入 xml 文件时丢失内容