bgu*_*ach 13 python orm many-to-many filtering sqlalchemy
我在SQLAlchemy中遇到了一个问题,并在编写时找到了解决方案.无论如何,我发布它,以防它有助于某人:)
假设我有很多关系似乎有效(至少我可以取儿)三个表:帖子,标签和post_tags.
import sqlalchemy as alc
class Tag(Base):
__tablename__ = 'tags'
id = alc.Column(alc.Integer, primary_key=True)
name = alc.Column(alc.String)
accepted = alc.Column(alc.Integer)
posts = relationship('Post', secondary=post_tags)
class Post(Base):
__tablename__ = 'posts'
id = alc.Column(alc.Integer, primary_key=True)
text = alc.Column(alc.String)
date_out = alc.Column(alc.Date)
tags = relationship('Mistake_Code', secondary=post_tags)
# relational table
post_tags = alc.Table('check_point_mistakes',
Base.metadata,
alc.Column('post_id', alc.Integer,ForeignKey('posts.id')),
alc.Column('tag_id', alc.Integer, alc.ForeignKey('tags.id')))
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我想先在Post中使用date_out进行过滤.我可以这样得到它:
# assume start_date and end_date
query = (
session.query(Post)
.filter(Post.date_out.between(start_date, end_date))
)
Run Code Online (Sandbox Code Playgroud)
但是如何同时按标签过滤?
bgu*_*ach 17
query = (
session.query(Post)
.join(Post.tags) # It's necessary to join the "children" of Post
.filter(Post.date_out.between(start_date, end_date))
# here comes the magic:
# you can filter with Tag, even though it was not directly joined)
.filter(Tag.accepted == 1)
)
Run Code Online (Sandbox Code Playgroud)
免责声明:这是我的实际代码的一个减少的例子,我可能在简化时犯了一个错误.
我希望它对某人有所帮助.
| 归档时间: |
|
| 查看次数: |
5902 次 |
| 最近记录: |