为分层模型创建高效的数据库查询(django)

2024-02-07

考虑这个(django)模型:

class Source(models.Model):
   # Some other fields
   type = models.ForeignKey('Type')

class Type(models.Model):
    # Some other fields
    parent = models.ForeignKey('self')

该模型自身有一个外键,从而创建了一个层次结构。

假设我们有以下层次结构:

Website
    Blog
    News    
    Social Network
    Q&A
    Forum
Radio
    Government radio
    Pirate radio
    Commercial radio
    Internet radio

我如何有效地查询,以便如果我选择Source by Type,我也检索Sources其中有一个Type那是给定类型的孩子吗?

我尝试过遍历整棵树,但这显然不是很有效。

另一种选择是使用 ManyToManyField 并通过覆盖 save() 方法自动附加父类型。例如,如果选择“博客”,则还会创建“网站”记录。但这对我来说似乎太过分了。


django-mptt 或 django-treebeard 是分层数据的好帮手。它们都向您的模型添加额外的元数据以允许高效的查询。

如果您选择使用 django-treebeard 您的模型可能如下所示:

from django.db import models
from treebeard.mp_tree import MP_Node

class Source(models.Model):
    # Some other fields
    type = models.ForeignKey('Type')

class Type(MP_Node):
    # Some other fields
    name = models.CharField(max_length=100)

    # parent gets added automatically by treebeard
    # parent = models.ForeignKey('self', blank=True, null=True)

可以这样查询:

# get all Sources of Type type and descendants of type
type = Type.objects.get(name='Radio')
Source.objects.filter(type__in=type.get_descendants())

see https://django-treebeard.readthedocs.io/en/latest/api.html https://django-treebeard.readthedocs.io/en/latest/api.html更多可能的查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为分层模型创建高效的数据库查询(django) 的相关文章

随机推荐

  • 使用 SciPy 绘制分位数-分位数图

    如何使用 Python 创建 qq plot 假设您有大量测量值并且正在使用某种以 XY 值作为输入的绘图函数 该函数应根据某些分布 正态分布 均匀分布 的相应分位数绘制测量值的分位数 由此产生的图让我们可以评估我们的测量是否遵循假设的分布
  • 有什么理由使用同步 XMLHttpRequest 吗?

    似乎大多数人都使用 XMLHttpRequest 执行异步请求 但显然 能够执行同步请求的事实表明可能有这样做的正当理由 那么这个合理的理由可能是什么 同步 XHR 对于保存用户数据很有用 如果您处理beforeunload您可以在用户关闭
  • 文本框不可点击但可编辑

    我有一个带有 10 个文本框的小表单 我将它们设置为当前正确的 Tab 顺序 就像我希望它们按 Tab 到的方式一样 我想知道是否有一种方法可以设置文本框 以便它们不能被选择进行编辑 除非它们被选项卡插入 即 我不希望最终用户能够单击文本框
  • 如何在Oracle中定义ON COMMIT触发器?

    oracle数据库中是否有任何方法可以定义触发器 当指定的表发生更改时 该触发器将在提交之前同步触发 如果抛出异常则回滚 Oracle中没有ON COMMIT触发机制 不过 还有一些解决方法 您可以使用带有 ON COMMIT REFRES
  • 您最喜欢的 Windbg 提示/技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 等待文件可供 Win32 读取

    我正在通过调用查看目录ReadDirectoryChangesW同步地 当新文件可用时 我尝试立即访问它CreateFile with GENERIC READ and FILE SHARE READ 但这给了我ERROR SHARING
  • 在MySQL中使用存储过程时遇到两个问题

    下面是我正在其中进行利息计算的存储过程的示例代码 该代码不可执行 因为根据在游标声明之前定义创建临时表块时发现其获取问题 但如果我最近在游标声明之后定义了相同的内容 那么它会成功执行 1 我的问题是我在光标内使用该表 所以我必须在光标后定义
  • 网页抓取,获取空列表

    我很难用我的网络抓取代码找出正确的路径 我正在尝试从中获取不同的信息http financials morningstar com company profile c action t AAPL http financials mornin
  • “ipython”选项卡自动完成功能不适用于导入的模块

    IPython 上的制表符补全似乎不起作用 例如 import numpy numpy
  • 如何使用 FTPS/TLS 1.2 版模拟 FTP 连接?

    我有一个 Python 代码 使用 HTTPS 和 TLS 版本 1 2 从 FTP 读取一些文件 这是函数 凭证是从 AWS 秘密管理器读取的 def ftp connection host username password try f
  • Identity Server 3 - Ajax 调用上的 401 而不是 302

    我有一个 Web api mvc 混合应用程序 我已将其配置为使用 cookie 身份验证 这对于应用程序的 mvc 部分效果很好 Web api 确实强制执行授权 但不是返回401 Unauthorised它返回一个302 Found并重
  • 当我使用 doReturn(..).when(....) 时,PowerMockito 正在调用该方法

    我是 PowerMockito 的新手 它显示的行为我不明白 以下代码解释了我的问题 public class ClassOfInterest private Object methodIWantToMock String x String
  • QT和MFC哪个更好学[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将对象添加到 ArrayList 指定索引处

    我认为这是一个相当简单的问题 但我不知道如何正确地做到这一点 我有一个空的数组列表 ArrayList list new ArrayList 我有一些对象 我想在其中添加对象 并且每个对象必须位于某个位置 然而 有必要将它们按每种可能的顺序
  • Inner Join 是否存在性能问题?

    目前我在我的 sp 中使用了很多内部联接 大约 7 个 它对 sp 性能有任何影响吗 左外连接是否比内连接提供更好的性能 另一件事是 如果我连接两个表 a 和 b 其中列 id 和 id1 都不可为空 我想在这里我可以进行内部联接 因为这些
  • 在 HTML 选择标签中找到默认选择的选项?

    我在网上找到了清除表单的代码 但它没有用于选择框的内容 使用 jquery 当我重置表单时 我尝试添加代码来选择选择框中的默认选项 我认为找到默认值的唯一方法是查找 SELECTED 选项所在的位置 然后我发现 当用户选择其他内容时 jqu
  • 如何确保即使在异常终止时也会调用 UnhookWindowsHookEx?

    不幸的是 MSDN 对此还不够清楚 我正在编写一个使用全局钩子的程序 我担心如果程序异常终止 崩溃 被用户杀死等 会发生什么 当进程终止时 Windows 是否会自动取消进程安装的全局挂钩 如果没有 是否可以在另一个进程中调用UnhookW
  • 升级到 bootstrap-sass 3.2.0 时出现问题

    将 bootstrap sass gem 升级到时是否还需要引用 配置其他内容 gt 3 2 0 使用 RubyMine 6 3 作为编辑器 并在 Gemfile 中添加以下内容 ruby 2 1 2 gem rails 4 1 1 gem
  • Jinja2 按空格分割字符串

    我正在使用 Jinja2 模板引擎 pelican 我有一个字符串说 a 1 我正在寻找一种方法将该字符串分成两部分 使用空格作为分隔符 所以我正在寻找的最终结果是一个变量 它以数组的形式保存两个值 例如str 0 计算结果为 a str
  • 为分层模型创建高效的数据库查询(django)

    考虑这个 django 模型 class Source models Model Some other fields type models ForeignKey Type class Type models Model Some othe