Django orm的复杂SQL表达式功能。
项目描述
Django默认提供广泛的字段类型和通用查找器,这在许多情况下已经足够。但是,有些情况下需要使用自己定义的类型和不在Django查找器中定义的搜索运算符,另一个重要的情况是在WHERE子句中执行某些函数的搜索。
在Django中,对于这些最后两个情况,需要编写SQL语句。"djorm-ext-expressions"引入了manager.where()
方法和一些类(SqlExpression、SqlFunction、AND、OR等)以简化高级情况下的SQL构建。
简单用法
想象一下一些具有postgresql整数数组字段的Django模型。您需要在该字段中查找包含一组群组编号的对象。
注意:数组字段是Django orm扩展包的一部分,位于djorm-ext-pgarray子模块中。
示例模型定义
from django.db import models
from djorm_expressions.models import ExpressionManager
from .somefiels import ArrayField
class Register(models.Model):
name = models.CharField(max_length=200)
points = ArrayField(dbtype="int")
objects = ExpressionManager()
使用此模型定义,我们可以执行此搜索
from djorm_expressions.base import SqlExpression, 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)
此外,我们可以使用函数构建表达式
from djorm_expressions.base import SqlFunction
class BitLength(SqlFunction):
sql_function = "bit_length"
# search all registers items that bit_length(name) > 20.
qs = Register.objects.where(
SqlExpression(BitLength("name"), ">", 20)
)
最后,我可以重新定义“SqlExpression”的行为,使其更“面向对象”
class ArrayExpression(object):
def __init__(self, field):
self.field = field
def contains(self, value):
return SqlExpression(self.field, "@>", value)
def overlap(self, value):
return SqlExpression(self.field, "&&", value)
# search all register items that points field contains [2,3]
qs = Register.objects.where(
ArrayExpression("points").contains([2,3])
)
项目详情
关闭
djorm-ext-expressions-0.6.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f0d9e4d297b5f7d9bd5c63d6f9b636f8ebd913a5254c12fcdf64239cb358f7ae |
|
MD5 | fe716b3d1ec8c1e68435120c4012bb65 |
|
BLAKE2b-256 | ca56e5800128bf9dae3336a48db16e3880a41a1c006d837db4a63106136ab950 |