基于 JOIN 查询创建 Django 模型
Posted
技术标签:
【中文标题】基于 JOIN 查询创建 Django 模型【英文标题】:Create a Django model based on a JOIN query 【发布时间】:2013-12-31 15:21:02 【问题描述】:我对该主题的搜索导致了有关使用 sql 处理来自模型的数据的答案,但我想要做的是有效地创建一些行为类似于 django 其余部分的模型但基于自定义查询的东西,包括一个JOIN。
在 Microsoft Access 中,表单和报表可以像基于表一样容易地基于查询集,并且至少在某些时候这些记录集是可更新的。
我希望能够使用 django 的所有功能,但基础模型能够基于查询。可以这样做吗?
【问题讨论】:
创建一个可以从数据库视图中读取的模型很容易——如果这满足了您的需求,我可以向您展示如何做到这一点。创建一个可以写入数据库视图的模型需要您的数据库后端接受对视图的写入,我不知道有任何支持该功能的数据库后端。我想可能有一个我不知道。 如有必要,我可以编写执行更新、删除或插入的代码。我正在使用 postgresql,所以我想我可以在视图上创建触发器函数,该函数将在尝试更新我需要修改的视图的列时激活。我从未尝试过,但我认为这是可能的。然而,这会隐藏数据库中的实现,可能在 python 中,而不是在 django 中它应该在 models.py 中的地方 如果我要将代码放入模型中,那么我想我需要:1) 每次 django 执行 SELECT 查询时都会运行的函数。 2)一种让我的特殊模型字段在使用时返回列值的方法。 3) 一种拦截和实现对单个值的更新或对将写入数据库的任何操作进行整体拦截的方法。我还需要为我没有在字段上实现的操作模仿正确的例外 Django 使用其数据库后端包将模型更新转换为 SQL,因此从概念上讲,将模型更改的自定义转换转换为 SQL 的正确位置是编写自己的数据库后端。这比我以前的水平要低一些,所以我不确定是否有任何捷径可以保持它的合理性。 如果我设置 managed = False 是否意味着我禁止隐式数据库操作而必须自己启动它们? 【参考方案1】:如果您将模型声明为不受 django 管理,则可以这样做。但是您必须自己为表/视图创建 SQL 代码。
class SQLView(models.Model):
# your field definitions
class Meta:
managed = False
db_table = 'your_view_name'
使用 postgresql 作为数据库,您可以创建拦截操作的视图和规则或触发器。
【讨论】:
如何拦截更改字段或插入或删除记录的尝试? 我正在使用 postgresql,但我更愿意将实现放在模型中而不是数据库中。以上是关于基于 JOIN 查询创建 Django 模型的主要内容,如果未能解决你的问题,请参考以下文章