如何使用 Django ORM 将 qs.query 传递给自定义 plpgsql 函数?

How to pass qs.query to a custom plpgsql function with Django ORM?

我有一些查询集 qs = MyModel.objects.filter(fieldname='fieldname') 和一个 custom plpgsql function my_function(),我可以在 pg_shell 中使用它们,例如:

SELECT my_function('SELECT * FROM my_model');

如何使用 Django ORM 执行此操作?我尝试过:

with connection.cursor() as cursor:
    query, params = qs.query.sql_with_params()
    query = f"SELECT my_function('{query}')"
    cursor.execute(query, params)

但是qs.query.sql_with_params()并不是为了return有效SQL。

Django ORM 甚至可以实现这样的功能吗?

首先,如果你想打电话给function/procedure,就按

from django.db import connections
connection = connections['default']
with connection.cursor() as cursor:
    cursor.callproc('name_of_your_function', ('SELECT * FROM some_table WHERE whatever_you_want', ))
    result = cursor.fetchone()

接下来是关于来自 django orm 的真实 sql 查询,而不是带来 queryset.query 或 qs.query.sql_with_params 的糟糕查询,尤其是在您使用日期但实际日期将通过的情况下到 psycopg

from .models import SomeModel
qs = SomeModel.objects.filter(create_at__gt='2021-04-20')

from django.db import connections
conn = connections['default']

from django.db.models.sql.compiler import SQLCompiler
compiler = SQLCompiler(qs.query, conn, using=qs.using)

sql, params = compiler.as_sql()