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]))

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Netbeans hibernate pdf报告   java如何将通用JAXBElement作为输入   java如何在Spring中注入自定义ObjectFactory   使用webview下载java 安卓 instagram视频   是否可能使用Java在OpenCL上运行C应用程序?   java AbstractTableModel使用TreeMap<Integer,Vector<Object>作为实现insertRow()的基础   java使用@Transaction和spring boot 2.1回滚每个异常   java Hibernate批处理操作性能   swing从Java对象的ArrayList创建JTable   代码可读性为什么java没有相同的功能/替代方案   java Spring创建名为“org”的bean时出错。springframework。aop。配置。内部自动加速器   java如何在JTable中维护用户指定的列宽?   java FCM通知图标未更改   kryo如何在java之外向kryonet发送数据   java当记录计数很高且某些列被索引时,如何优化Oracle DB中的插入率?   ffmpeg如何使用java程序执行cmd命令