sqlalchemy在django中是否有类似Q的过滤器对象?

时间:2018-08-21 17:06:42

标签: python sqlalchemy

如何在sqlalchemy orm上重写使用django orm的代码?

list_of_filters = [Q(active=True)]

if self.proxy_anonymity:
    list_of_filters.append(Q(anonymity=True))

if self.proxy_https:
    list_of_filters.append(Q(https=True))

if hasattr(spider, 'bad_proxies') and spider.bad_proxies:
    list_of_filters.append(~Q(ip__in=spider.bad_proxies))

proxy_filter = reduce(operator.and_, list_of_filters)

return proxy_filter

1 个答案:

答案 0 :(得分:1)

SQLAlchemy通过在映射类上提供检测属性来使用另一种方法,如"Declare a Mapping"中所述:

  

在构造我们的类时,声明式将所有Column对象替换为称为descriptors的特殊Python访问器;这是一个称为instrumentation的过程。

然后,您可以使用SQL Expression Language来使用这些属性来构成谓词表达式。

形成实际表达式时有一些相似之处,例如分别使用按位运算符|&~作为OR,AND和NOT。另外,SQLAlchemy提供了构造or_()and_()not_()。总之,您应该阅读ORM教程中的"Querying"

因此,如果您的模型类例如是Proxy,则代码看起来像

# Note that it is redundant to compare a boolean column with a boolean value.
# Just use the value of the column itself.
list_of_filters = [Proxy.active]

if self.proxy_anonymity:
    # Again, use a boolean column as is.
    list_of_filters.append(Proxy.anonymity)

if self.proxy_https:
    list_of_filters.append(Proxy.https)

if hasattr(spider, 'bad_proxies') and spider.bad_proxies:
    list_of_filters.append(Proxy.ip.in_(spider.bad_proxies))

proxy_filter = and_(*list_of_filters)

return proxy_filter