跳转到主要内容

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 (5.8 kB 查看哈希值)

上传时间: 源代码

由以下支持