django orm的复杂sql表达式的功能。
djorm-ext-expressions的Python项目详细描述
默认情况下,django为查询提供了广泛的字段类型和泛型查找。这在很多情况下是远远不够的。但是在有些情况下,您需要使用为自己定义的类型和在django查找中未定义的搜索运算符,另一个重要的情况是进行需要在where子句中执行某些函数的搜索。
在django中,对于最后两种情况,它需要编写sql语句。djorm-ext-expressions引入方法manager.where()和一些类(sqlexpression、sqlfunction和,或,…)来简化高级情况下的sql构造。
简单用法
想象一下一些带有postgresql整数数组字段的django模型。您需要在包含一组组号的字段中查找对象。
note:数组字段是django orm扩展包的一部分,位于djorm-ext-pgarraysubmodule上。
示例模型定义
fromdjango.dbimportmodelsfromdjorm_expressions.modelsimportExpressionManagerfrom.somefielsimportArrayFieldclassRegister(models.Model):name=models.CharField(max_length=200)points=ArrayField(dbtype="int")objects=ExpressionManager()
使用此模型定义,我们可以执行以下搜索:
fromdjorm_expressions.baseimportSqlExpression,AND,OR# search all register items that points field contains [2,3]qs=Register.manager.where(SqlExpression("points","@>",[2,3]))# search all register items that points fields contains [2,3] or [5,6]expression=OR(SqlExpression("points","@>",[2,3]),SqlExpression("points","@>",[5,6]),)qs=Register.objects.where(expression)
此外,我们还可以使用函数构造表达式:
fromdjorm_expressions.baseimportSqlFunctionclassBitLength(SqlFunction):sql_function="bit_length"# search all registers items that bit_length(name) > 20.qs=Register.objects.where(SqlExpression(BitLength("name"),">",20))
我终于可以重新定义行为“sqlexpression”并使其更加“面向对象”:
classArrayExpression(object):def__init__(self,field):self.field=fielddefcontains(self,value):returnSqlExpression(self.field,"@>",value)defoverlap(self,value):returnSqlExpression(self.field,"&&",value)# search all register items that points field contains [2,3]qs=Register.objects.where(ArrayExpression("points").contains([2,3]))