【问题标题】:Flask how to query with a filter that checks whether a value is present in a list?Flask如何使用检查列表中是否存在值的过滤器进行查询?
【发布时间】:2021-01-11 10:41:06
【问题描述】:

我正在制作一个结构化的错误跟踪器,以便每个用户可以拥有多个项目,并且每个项目都可以记录多个错误。我希望用户能够查看自上次登录以来在所有项目中报告了多少新错误。

我将其构建为用户模型、项目模型和错误模型。我在下面列出了三个模型及其相关列:

class Users(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key = True, nullable = False)
    # ...
    last_login = db.Column(db.DateTime, nullable = False)
    # AS PARENT
    owned_projects = db.relationship('Projects', backref="project_owner")

class Projects(db.Model):
    id  = db.Column(db.Integer, primary_key = True, nullable = False)
    # ...
    # AS CHILD
    owner = db.Column(db.Integer, db.ForeignKey('users.id'))
    # AS PARENT
    bugs = db.relationship('Bugs', backref = 'containing_project')

class Bugs(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    # ...
    status = db.Column(db.String(20))
    report_date = db.Column(db.DateTime, index = True, default = dt.datetime.now())
    # AS CHILD
    project = db.Column(db.Integer, db.ForeignKey('projects.id'))

要过滤自用户上次登录以来报告的错误的错误查询,我可以执行类似Bugs.query.filter(Bugs.report_date > current_user.last_login) 的过滤器。这显示了所有用户的所有错误,但我无法构建一个查询,将其过滤为仅用户拥有的项目中的错误。

.filter(Bugs.containing_project in current_user.owned_projects) 返回“”,但我不知道如何使用它。我读到了关于.contains 的信息,但方向错误,current_user.owned_projects.contains(Bugs.project) 不起作用。

我也尝试了.filter(Bugs.containing_project.owner == current_user.id),但收到错误“AttributeError:与 Bugs.containing_project 关联的 'InstrumentedAttribute' 对象和 'Comparator' 对象都没有属性 'owner'”。

我现在能想到的唯一选择是遍历每个错误以找到属于用户拥有的项目的错误,但这在性能方面将是噩梦。肯定有.in 方法或类似的方法吗?

请告知我如何实现这一点,在此先感谢!

【问题讨论】:

    标签: flask filter sqlalchemy contains


    【解决方案1】:

    这段代码不起作用?

    .filter(Bugs.containing_project.any(Projects.id.in_([ proj['id'] for proj in current_user.owned_projects])
    

    我参考了这个网站。
    SQLAlchemy: filter by membership in at least one many-to-many related table

    而且,如果我的回答效果不佳,本网站可能会为您提供帮助。
    SQLAlchemy how to filter by children in many to many

    【讨论】:

    • 谢谢!我稍微改变了你的建议 - .filter(Bugs.containing_project.has(Projects.id.in_([ proj.id for proj in current_user.owned_projects])))。我的模型没有使用多对多关系,所以Projects 不可下标,我不能使用.any 方法。相反,我使用的是.has,这似乎有效!对于可能遇到您的答案的其他任何人,您能否在代码块中添加 2")" 以关闭所有括号?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多