Django 快捷方式嵌套外键

2023-11-30

假设我的 models.py 中有以下内容:

class Book:
    pass

class Part:
    book = models.ForeignKey(Book)

class Chapter:
    part = models.ForeignKey(Part)
    number = models.IntegerField()

我想要做

book = Book.objects.get(id=someID)
chapters = Book.chapters.get(number=4)

这样做的干净方法是什么?我在书本课上想到了经理,但它似乎不适用于这种情况。

当然,我可以在课堂书籍上实现 get_chapters 方法,但我想避免这种情况。

有任何想法吗 ?


使用 FK 字段的 related_name 参数,再加上查询集的 prefetch_lated,将允许您以最小的性能影响获取与书籍相关的所有信息(每个 prefetch_lated 参数调用一个单独的查询)。

class Book:
    pass

class Part:
    book = models.ForeignKey(Book, related_name="parts")

class Chapter:
    part = models.ForeignKey(Part, related_name="chapters")
    number = models.IntegerField()

# fetch a book and all related info w/ only 2 db hits
book = Book.objects.first().prefetch_related("parts","parts__chapters")
print(book.parts.all()) # returns all parts for book
for part in book.parts.all():
    print part.chapters.all()

您也可以在模板中执行此操作。

但是,为了获得最佳性能的解决方案,请同时保存 FK 以从章节中进行预订。这可以通过重写 save 方法轻松完成。

class Chapter:
    part = models.ForeignKey(Part, related_name="part_chapters")
    number = models.IntegerField()
    book = models.ForeignKey(Book, related_name="chapters", null=True, blank=True) # allow null/blank values; will be populated in save method
    def save(self, *args, **kwargs):
        self.book = self.part.book
        super(Chapter, self).save(*args, **kwargs)

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

Django 快捷方式嵌套外键 的相关文章

随机推荐

  • 收集时出现奇怪的异常

    当我尝试添加 插入 删除到集合 或任何更改集合的操作 时 出现以下异常 集合已初始化 插入的项不为 null 且与集合 T 类型相同 任何人都可以告诉我为什么会发生这种情况吗 运行时遇到致命错误 错误的地址是0x60f41744 在线程上0
  • 使用 Paramiko 进行多重身份验证(密码和密钥)

    我有以下代码 import paramiko policy paramiko client WarningPolicy client paramiko client SSHClient client set missing host key
  • java 游戏定时器

    我已经用 java 创建了一个游戏 现在我只需要添加一个计时器 允许用户在 60 秒内玩 我在互联网上搜索并找到了 swing 和 util 包的计时器 你能给我一个在我的游戏中使用它的方法吗 如果你想要一些互动的东西 你可以使用Timer
  • 确定 GIF 动画状态?

    有没有办法通过javascript检测GIF图像的动画是否完成 不它不是 JavaScript 无法直接操作 GIF 但也许jsgif可以帮你
  • Python 3 中 execfile 的替代品? [复制]

    这个问题在这里已经有答案了 Python 2 有内置函数execfile 在 Python 3 0 中被删除 这个问题讨论了 Python 3 0 的替代方案 但有些相当大的变化已经做了从Python 3 0开始 最好的替代方案是什么exe
  • Azure DocumentDB - 源自脚本的请求无法引用除为其提交客户端请求的分区键之外的分区键

    使用 c Net 客户端 SDK 我调用 ExecuteStoredProcedureAsync 方法 如下所示 sproc response await client ExecuteStoredProcedureAsync
  • 在css中使用自定义字体时出错

    虽然我尝试通过 CSS 文件为我的网站使用自定义字体 但我没有获得所需的字体 并且仅显示默认字体 请检查 css 代码 如果需要任何更改 请告诉我 font face font family Myriad Pro src url Myria
  • 从与变量匹配的另一列查找值

    我有一个数据框 如下所示 animal id trait id sire id dam id 1 25 05 0 0 2 46 3 1 2 3 41 6 1 2 4 42 76 3 4 5 10 99 3 4 6 49 81 5 4 我想创
  • 从Google Apps脚本中的类似csv文件读取数据

    我有一个 Windows 脚本文件 尽管不是 Google Apps 脚本 它将数据输出到文本文件 该文件包含以逗号分隔的数字 类似于 CSV 文件 但以编程方式创建 我可以在 Excel 中将其作为 CSV 文件打开 该文件存储在我的 G
  • querySelectorAll - 我可以在选择器中添加“:after”吗?

    我可以在 JavaScript 中执行此操作吗 var Dim Back document querySelectorAll s1 after for var i 0 i lt Dim Back length i Dim Back i st
  • 使用 TPL 数据流的请求/响应模式

    我们遇到一个问题 在使用 TPL 数据流库时需要请求 响应模式 我们的问题是我们有一个调用依赖服务的 NET core API 依赖服务限制并发请求 我们的API不限制并发请求 因此 我们一次可以收到数千个请求 在这种情况下 依赖服务将在达
  • 如何编译wxsqlite3和sqlite以获得加密支持

    我正在开发一个基于 wxWidgets 的 C 项目 使用wxSqlite3访问sqlite数据库 并且工作正常 但我想为数据库添加一些加密 在这里我通过 wxSqlite3 访问加密数据库时遇到问题 据我所知 sqlite默认不支持加密
  • Ansible 使用了错误版本的 Python

    我已经处理这个问题几天了 我在树莓派上运行ansible 我已将Python3 7设为Python的默认版本 显然 Ansible 希望使用 Python 2 7 我已在 playbook 的 vars 中添加了版本 3 7 但这不会更改模
  • 在全屏 Win32 OpenGL 中处理最小化

    我正在尝试使用 Win32 和 OpenGL 创建一个全屏应用程序 我使用更改分辨率EnumDisplaySettings and ChangeDisplaySettings并且 OpenGL 功能运行良好 在其 WndProc 上 我处理
  • Swing 中的进度对话框

    我怎样才能制作模态JDialog没有按钮出现的持续时间需要Runnable实例完成并让该实例更新该对话框上的进度条 消息 显然意大利面条代码可能有效 但我正在寻找一种干净的设计 如果存在 您可能想调查一下进度监视器 如果操作时间较长 会自动
  • .Net 控制计算机之间大小的变化

    我有一个奇怪的问题 我需要弄清楚如何解决 过去几周我一直在我的笔记本电脑上开发一个项目 但是当我在其中一台工作电脑上打开程序时 很多控件的尺寸错误和重叠等 机器之间的差异是这样的 Laptop Windows 7 专业版 显示 1920 1
  • 在MySQL中,我们如何判断表的索引是否是聚集索引?

    在MySQL中 我们如何判断表的索引是否是聚集索引 我们可以用show index from table name获取有关表索引的信息 但我没有发现它显示每个索引是聚集的还是非聚集的 这样做的目的是MySQL中如果一个表有索引 那么该表就必
  • Django FormWizard 动态改变 form_list

    我在使用表单向导时遇到了一些问题 也许有人可以解释一下 根据 process step 方法中的文档字符串 我可以 动态更改 self form list 因此 根据我的项目需求 我将表单附加到 form list 中 我附加的表格包含问题
  • 在外发电子邮件 EWS 中设置回复地址

    运行交换 2013 我在 C 服务中使用 EWS 该服务从服务帐户发送电子邮件 我想让电子邮件有一个与发送帐户不同的回复地址 即通讯组列表地址 我怎样才能做到这一点 这EmailMessage ReplyTo字段是只读的 Code Exch
  • Django 快捷方式嵌套外键

    假设我的 models py 中有以下内容 class Book pass class Part book models ForeignKey Book class Chapter part models ForeignKey Part n