首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于MyModel.objects.raw()的表值函数的Django模型

基于MyModel.objects.raw()的表值函数的Django模型
EN

Stack Overflow用户
提问于 2020-09-23 23:01:01
回答 1查看 149关注 0票数 2

如果相关,我将Django与Django Rest框架、django-mssql-backend和pyodbc一起使用

我正在使用相当复杂的查询和Django的MyModel.objects.raw()功能构建遗留数据库的一些只读模型。最初,我将查询作为Select查询执行,该查询运行良好,但是我收到一个请求,要求尝试执行相同的操作,但使用数据库中的表值函数。

执行以下操作:

代码语言:javascript
运行
复制
MyModel.objects.raw(select * from dbo.f_mytablefunction)

给出错误:无效的对象名称'myapp_mymodel‘。更深入地查看出错时的局部变量,它看起来像是生成了以下SQL:

代码语言:javascript
运行
复制
'SELECT [myapp_mymodel].[Field1], '
 '[myapp_mymodel].[Field2] FROM '
 '[myapp_mymodel] WHERE '
 '[myapp_mymodel].[Field1] = %s'

模型本身在执行等价物时被正确地映射到查询:

代码语言:javascript
运行
复制
MyModel.objects.raw(select * from dbo.mytable)

按预期返回数据,dbo.f_mytablefunction定义为:

代码语言:javascript
运行
复制
CREATE FUNCTION dbo.f_mytablefunction
(
     @param1 = NULL etc etc
)
RETURNS TABLE
AS
RETURN
(
    SELECT
            field1, field2 etc etc
        FROM            
            dbo.mytable
)

如果有人能解释为何这两种运作模式会有本质上的分别,我很乐意找出答案。

EN

Stack Overflow用户

发布于 2021-03-19 22:17:23

我猜你现在已经弄明白了(参见docs):

代码语言:javascript
运行
复制
MyModel.objects.raw('select * from dbo.f_mytablefunction(%s)', [1])

如果您希望将表值函数映射到模型,this gist有一种非常全面的方法,但没有提到许可证。

一旦您将模型的‘TableFunctionManager’指向新的对象并添加了'function_args‘OrderedDict (参见gist中的测试),您就可以按如下方式查询它:

代码语言:javascript
运行
复制
MyModel.objects.all().table_function(param1=1)

如果有人想知道表值函数的用例,可以尝试搜索“your_db_vendor tvf”。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64030810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档