为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地向 SQLAlchemy 查询添加多个过滤器,而无需重复代码

有条件地向 SQLAlchemy 查询添加多个过滤器,而无需重复代码

翻翻过去那场雪 2023-08-22 15:50:40
我有一个 SQLAlchemy 模型:class Ticket(db.Model): __tablename__ = 'ticket' id = db.Column(INTEGER(unsigned=True), primary_key=True, nullable=False, autoincrement=True) cluster = db.Column(db.VARCHAR(128)) @classmethod def get(cls, cluster=None):     query = db.session.query(Ticket)     if cluster is not None:         query = query.filter(Ticket.cluster==cluster)     return query.one()如果我添加一个新列并想扩展该get方法,我必须添加if xxx is not None如下所示的列: @classmethod def get(cls, cluster=None, user=None):     query = db.session.query(Ticket)     if cluster is not None:         query = query.filter(Ticket.cluster==cluster)     if user is not None:         query = query.filter(Ticket.user==user)     return query.one()有什么办法可以提高效率吗?如果我有太多列,该get方法就会变得很丑陋。
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

与往常一样,如果您不想编写重复的内容,请使用循环:


@classmethod

def get(cls, **kwargs):

    query = db.session.query(Ticket)

    for k, v in kwargs.items():

        query = query.filter(getattr(table, k) == v)

    return query.one()

因为我们不再将cluster=None/设置user=None为默认值(而是取决于调用者未指定的内容永远不会添加到kwargs),所以我们不再需要阻止添加空值过滤器:唯一的方法是如果用户实际要求搜索None;的值,则 null 值将最终出现在参数列表中。因此,如果该请求发生,这个新代码能够满足该请求。


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 1579 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信