Flask-SQLAlchemy筛选与父模型的多对多关系

道格·米勒(Doug Miller)

我有一个Parent模型,几个不同类型的项目通过外键用作其父项。我在父模型上也有很多对很多的关系。我正在尝试基于查询多对多模型来获取子模型。

这是父模型

class MediaItem(db.Model):
    __tablename__ = "media_item"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String, unique=True)
    tags = db.relationship('Tags', secondary=tags_joiner, backref='media_items')
    videos = db.relationship('Video', backref='Parent', lazy='dynamic')
    audios = db.relationship('Audio', backref='Parent', lazy='dynamic')
    pictures = db.relationship('Picture', backref='Parent', lazy='dynamic')
    codes = db.relationship('Code', backref='Parent', lazy='dynamic')

与多对多的关系

class Tags(db.Model):
    __tablename__ = 'tags'
    id = db.Column(db.Integer, primary_key=True)
    tag = db.Column(db.String, unique=True, nullable=False)


tags_joiner = db.Table('tags_joiner',
                       db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')),
                       db.Column('mediaitem_id', db.Integer, db.ForeignKey('media_item.id')),
                       db.PrimaryKeyConstraint('tag_id', 'mediaitem_id'))

最后有一个子模型的例子

class Video(db.Model):
    __tablename__ = 'video'
    id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('media_item.id'))
    file_name = db.Column(db.String, unique=True)

MediaItem模型中定义的关系证明了其他两种类型的子模型。

我正在寻找通过标签对子模型进行过滤。也就是说,在给定特定标签的情况下,返回与该标签关联的所有子模型。

Video.query.join(media_tags).filter_by(MediaItem.tags.any(Tags.tag.in_(tag)))

返回它不知道如何连接这三个表的信息(找不到连接的FROM子句。尝试连接到,但是得到:找不到'media_item'和'tags'之间的任何外键关系。)

我的解决方法是什么?

版本1:以下查询应返回所需结果:

tag = 'my_filter_tag'
q = (
    db.session
    .query(Video)
    .filter(Video.Parent.has(MediaItem.tags.any(Tags.tag == tag)))
)

它可能不是最理想的,因为它是SQL由两个嵌套EXISTS子句产生的,但是绝对是非常易读的sqlalchemy查询。这是为产生的查询sqlite

SELECT  video.id AS video_id, video.parent_id AS video_parent_id, video.file_name AS video_file_name
FROM    video
WHERE EXISTS (
    SELECT  1
    FROM    media_item
    WHERE   media_item.id = video.parent_id
        AND (
        EXISTS (
            SELECT 1
            FROM    tags_joiner, tags
            WHERE   media_item.id = tags_joiner.mediaitem_id
                AND tags.id = tags_joiner.tag_id
                AND tags.tag = :tag_1
            )
        )
    )

第2版​​:更为优化的查询是在上加入media_item,但仍在exists标记上执行

q = (
    db.session
    .query(Video)
    .join(MediaItem, Video.Parent)
    .filter(MediaItem.tags.any(Tags.tag == tag))
)

将产生SQL如下:

SELECT  video.id AS video_id, video.parent_id AS video_parent_id, video.file_name AS video_file_name
FROM    video
JOIN    media_item
    ON  media_item.id = video.parent_id
WHERE   EXISTS (
    SELECT  1
    FROM    tags_joiner, tags
    WHERE   media_item.id = tags_joiner.mediaitem_id
        AND tags.id = tags_joiner.tag_id
        AND tags.tag = :tag_1
    )

你也可以加入进一步的tags_joinertags实现的结果。但这消除了一些灵活性:如果您想执行并OR检查多个标签,结果可能会返回多个Video行,而保留查询EXISTS将可以解决这一问题。


请注意,您的代码有一个media_tags,但不清楚它是什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在SQLAlchemy(python,flask)中为模型用户创建多对多关系

来自分类Dev

Flask / SQLAlchemy-多对多关系的关联模型和关联表之间的区别?

来自分类Dev

如何在SQLAlchemy(python,flask)中为模型用户创建多对多关系

来自分类Dev

Flask-Sqlalchemy 3种多对多关系

来自分类Dev

Flask-Sqlalchemy,多对多关系中的辅助表的主键

来自分类Dev

我应该使用flask sqlalchemy多对多关系吗?

来自分类Dev

如何使用flask-sqlalchemy多次插入多对多关系?

来自分类Dev

Flask-Sqlalchemy,多对多关系中的辅助表的主键

来自分类Dev

Flask-appbuilder多对多关系sqlalchemy.exc.NoReferencedTableError错误

来自分类Dev

使用多对多关系时,Flask-SQLAlchemy返回查询中的对象

来自分类Dev

Flask-appbuilder多对多关系sqlalchemy.exc.NoReferencedTableError错误

来自分类Dev

SQLAlchemy + Flask多对一关系

来自分类Dev

Jsonify Flask-SQLAlchemy Flask中的多对一关系

来自分类Dev

Flask-SQLAlchemy:更新一对多关系

来自分类Dev

Flask帮助理解多对多关系上的primaryjoin / secondaryjoin

来自分类Dev

Flask SQLAlchemy关系

来自分类Dev

Flask SQLAlchemy关系

来自分类Dev

Flask-SQLalchemy-从子类的父类获取关系参数

来自分类Dev

SQLAlchemy:在多对多关系中筛选运算符

来自分类Dev

SQLAlchemy:在多对多关系中筛选运算符

来自分类Dev

Flask:使用带有关系的SQLalchemy模型填充WTform

来自分类Dev

Jsonify flask-sqlalchemy烧瓶中的多对一关系

来自分类Dev

Flask-SQLAlchemy多对多

来自分类Dev

在Flask sqlalchemy中订购一对多模型?

来自分类Dev

Flask SQLAlchemy order_by关系

来自分类Dev

如何在Flask SQL Alchemy中查询一对多/多对多关系?

来自分类Dev

多对多关系孩子专属于父模型。如何?

来自分类Dev

flask-sqlalchemy,一对多关系,外键变为NULL

来自分类Dev

如何在Flask-Admin表单中处理有序的多对多关系(关联代理)?

Related 相关文章

  1. 1

    如何在SQLAlchemy(python,flask)中为模型用户创建多对多关系

  2. 2

    Flask / SQLAlchemy-多对多关系的关联模型和关联表之间的区别?

  3. 3

    如何在SQLAlchemy(python,flask)中为模型用户创建多对多关系

  4. 4

    Flask-Sqlalchemy 3种多对多关系

  5. 5

    Flask-Sqlalchemy,多对多关系中的辅助表的主键

  6. 6

    我应该使用flask sqlalchemy多对多关系吗?

  7. 7

    如何使用flask-sqlalchemy多次插入多对多关系?

  8. 8

    Flask-Sqlalchemy,多对多关系中的辅助表的主键

  9. 9

    Flask-appbuilder多对多关系sqlalchemy.exc.NoReferencedTableError错误

  10. 10

    使用多对多关系时,Flask-SQLAlchemy返回查询中的对象

  11. 11

    Flask-appbuilder多对多关系sqlalchemy.exc.NoReferencedTableError错误

  12. 12

    SQLAlchemy + Flask多对一关系

  13. 13

    Jsonify Flask-SQLAlchemy Flask中的多对一关系

  14. 14

    Flask-SQLAlchemy:更新一对多关系

  15. 15

    Flask帮助理解多对多关系上的primaryjoin / secondaryjoin

  16. 16

    Flask SQLAlchemy关系

  17. 17

    Flask SQLAlchemy关系

  18. 18

    Flask-SQLalchemy-从子类的父类获取关系参数

  19. 19

    SQLAlchemy:在多对多关系中筛选运算符

  20. 20

    SQLAlchemy:在多对多关系中筛选运算符

  21. 21

    Flask:使用带有关系的SQLalchemy模型填充WTform

  22. 22

    Jsonify flask-sqlalchemy烧瓶中的多对一关系

  23. 23

    Flask-SQLAlchemy多对多

  24. 24

    在Flask sqlalchemy中订购一对多模型?

  25. 25

    Flask SQLAlchemy order_by关系

  26. 26

    如何在Flask SQL Alchemy中查询一对多/多对多关系?

  27. 27

    多对多关系孩子专属于父模型。如何?

  28. 28

    flask-sqlalchemy,一对多关系,外键变为NULL

  29. 29

    如何在Flask-Admin表单中处理有序的多对多关系(关联代理)?

热门标签

归档