通过定制Django数据库函数,在过滤查询方面有更多控制权

Django的数据库函数代表将在数据库中运行的函数。它为用户提供了一种方法来使用底层数据库提供的函数作为注释、聚合或过滤器。函数也是表达式,所以它们可以被使用并与其他表达式相结合,如聚合函数。
Django丰富的功能之一包括对其各种功能的定制。是的,你没看错!就是这个意思。🙌 我们可以根据自己的需要来定制Django的数据库功能。
📝 在这篇文章中,我们将通过下面的几个例子来了解根据我们的业务需求编写自定义函数的要点。
👉让我们先了解一下Django Func()类,它是我们前进的基础。
📜 Django Func(*expressions, **extra) 类
- Func()类是Django查询表达式中最通用的部分。
- 它允许以某种方式在Django ORM中实现几乎所有的函数或运算符。
- Func()表达式是所有涉及数据库函数(如COALESCE和LOWER)或聚合(如SUM)的表达式的基础类型。
- 我建议在使用Func()之前阅读《避免SQL注入》。
以下是一些编写我们自定义数据库函数的方法。
🔹自定义数据库函数
我们可以使用Django的Func类创建我们的自定义数据库函数。在我的一个项目中,我想在Django过滤器中把UTC时间戳转换为IST的特定日期格式。编写两个简单的Django数据库函数帮助我在多个实例中重复使用,如下。
from django.db.models import Func
🔹 数据库函数的部分实现
另一个很好的定制例子是制作一个新版本的函数,其中已经填入一个或两个参数。例如,让我们创建一个专门的SubStr,从一个字符串中提取第一个字符。
from functools import partial
🔹 执行没有聚合函数的GROUP BY
想象一下,我们想在不使用任何聚合函数的情况下使用GROUP BY。Django ORM不允许我们在没有聚合函数的情况下使用GROUP BY 🤨因此,为了达到这个目的,我们可以创建一个Django函数,该函数被Django视为聚合函数,但在SQL查询中被评估为NULL,如StackOverflow提供的资料
from django.db.models import CharField, Func
📑 资源
原文发表于 https://dev.to 于2022年5月19日。
编写自定义Django数据库函数》最初发表在Medium上的《Towards Data Science》,人们通过强调和回应这个故事来继续对话。