Sql server Django模型基于使用MyModel.objects.raw()的SQL表值函数
如果相关的话,我将Django与Django Rest框架、Django mssql后端和pyodbc一起使用 我正在使用相当复杂的查询和Django的MyModel.objects.raw()功能构建一些遗留数据库的只读模型。最初,我将查询作为一个Select查询执行,该查询运行良好,但是我收到了一个请求,请求尝试执行相同的操作,但使用数据库中的表值函数 执行此命令:Sql server Django模型基于使用MyModel.objects.raw()的SQL表值函数,sql-server,django,django-models,django-rest-framework,pyodbc,Sql Server,Django,Django Models,Django Rest Framework,Pyodbc,如果相关的话,我将Django与Django Rest框架、Django mssql后端和pyodbc一起使用 我正在使用相当复杂的查询和Django的MyModel.objects.raw()功能构建一些遗留数据库的只读模型。最初,我将查询作为一个Select查询执行,该查询运行良好,但是我收到了一个请求,请求尝试执行相同的操作,但使用数据库中的表值函数 执行此命令: MyModel.objects.raw(select * from dbo.f_mytablefunction) 给出错误:
MyModel.objects.raw(select * from dbo.f_mytablefunction)
给出错误:无效的对象名称“myapp\u mymodel”。
在出错时深入查看局部变量,似乎生成了以下SQL:
'SELECT [myapp_mymodel].[Field1], '
'[myapp_mymodel].[Field2] FROM '
'[myapp_mymodel] WHERE '
'[myapp_mymodel].[Field1] = %s'
模型本身在执行等效查询时正确映射到查询:
MyModel.objects.raw(select * from dbo.mytable)
按预期返回数据,dbo.f_mytablefunction定义为:
CREATE FUNCTION dbo.f_mytablefunction
(
@param1 = NULL etc etc
)
RETURNS TABLE
AS
RETURN
(
SELECT
field1, field2 etc etc
FROM
dbo.mytable
)
如果有人对这两种操作模式的区别有任何解释,我会很高兴地找到答案。我想你现在已经明白了(请参阅): 如果您想将表值函数映射到一个模型,有一个非常彻底的方法,尽管没有提到许可证 一旦将模型“对象”指向新的TableFunctionManager并添加了“函数参数”OrderedDict(请参见gist中的测试),您就可以按如下方式查询它:
MyModel.objects.all().table_function(param1=1)
对于任何想了解表值函数用例的人,请尝试搜索“your_db_vendor tvf”
MyModel.objects.all().table_function(param1=1)