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

我有一个 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方法就会变得很丑陋。


翻翻过去那场雪
浏览 1580回答 1
1回答

红颜莎娜

与往常一样,如果您不想编写重复的内容,请使用循环:@classmethoddef 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 值将最终出现在参数列表中。因此,如果该请求发生,这个新代码能够满足该请求。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python