为什么 django 的 prefetch_lated() 只能与 all() 一起使用,而不能与 filter() 一起使用?

2023-12-12

假设我有这个模型:

class PhotoAlbum(models.Model):
    title = models.CharField(max_length=128)
    author = models.CharField(max_length=128)

class Photo(models.Model):
    album = models.ForeignKey('PhotoAlbum')
    format = models.IntegerField()

现在,如果我想有效地查看相册子集中的照片子集。我这样做:

someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
    somePhotos = a.photo_set.all()

这只执行两个查询,这正是我所期望的(一个查询获取相册,然后一个查询如“SELECT * IN photos WHERE photoalbum_id IN ()”)。

一切都很好。

但如果我这样做:

someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
    somePhotos = a.photo_set.filter(format=1)

然后它执行大量查询WHERE format = 1!我是否做错了什么,或者 django 不够聪明,无法意识到它已经获取了所有照片并可以在 python 中过滤它们?我发誓我在文档中读到它应该这样做......


在 Django 1.6 及更早版本中,无法避免额外的查询。这prefetch_related调用有效地缓存了结果a.photoset.all()对于查询集中的每个专辑。然而,a.photoset.filter(format=1)是一个不同的查询集,因此您将为每个专辑生成一个额外的查询。

这在prefetch_related文档。这filter(format=1)相当于filter(spicy=True).

请注意,您可以通过在 python 中过滤照片来减少数量或查询:

someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
    somePhotos = [p for p in a.photo_set.all() if p.format == 1]

在Django 1.7中,有一个Prefetch()允许您控制行为的对象prefetch_related.

from django.db.models import Prefetch

someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related(
    Prefetch(
        "photo_set",
        queryset=Photo.objects.filter(format=1),
        to_attr="some_photos"
    )
)
for a in someAlbums:
    somePhotos = a.some_photos

有关如何使用的更多示例Prefetch对象,请参阅prefetch_related docs.

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

为什么 django 的 prefetch_lated() 只能与 all() 一起使用,而不能与 filter() 一起使用? 的相关文章

  • 如何在包含 Django 模板标记的文件上运行 JSHint?

    我想在所有 Javascript 源文件上运行 JSHint 但其中一些源文件具有一些嵌入式 Django 模板标记 JSHint 在此标记上引发大量错误 有没有办法可以 告诉 JSHint 忽略此标记 使用一些虚拟数据运行 Django
  • 动态创建类 - Python

    我需要动态创建一个类 为了更详细地讲 我需要动态创建 Django 的子类Form class 通过 动态 我打算根据用户提供的配置创建一个类 e g 我想要一个名为CommentForm这应该子类化Form class 该类应该有一个选定
  • 无法创建超级用户 Django

    我假设这是因为我的超级用户依赖于还没有现有数据的 UserProfile 我的模型看起来像 from django db import models from django contrib auth models import User f
  • 跨应用程序使用 Django 模型?

    因此 在我的 Django 项目中 我有几个不同的应用程序 每个应用程序都有自己的模型 视图 模板等 让这些应用程序进行通信的好方法 Django 方式 是什么 一个具体的例子是一个会议应用程序 它有一个会议模型 我有一个家庭应用程序 我想
  • 如何使用基于类的视图处理表单(通过 get 或 post)?

    我正在尝试学习基于类的视图 因为详细信息或列表视图并不那么复杂 我有一个搜索表单 我只想看看是否发送查询来显示结果 这是函数代码 不是我的 来自 django 书籍 def search page request form SearchFo
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我
  • Django:分解视图

    这实际上只是一个 最佳实践 问题 我发现在开发应用程序时 我经常会遇到a lot的意见 将这些视图分成几个视图文件是常见的做法吗 换句话说 不仅仅是views py 通常还有views 1 py views 2 py views 3 py
  • TEST 镜像默认数据库但没有数据

    我正在尝试对我的 Django 应用程序进行一些测试 我使用了数据库镜像作为测试数据库 当我尝试运行一些测试时 默认数据库 中的数据似乎在镜像测试数据库中不可用 default sqlite ENGINE django db backend
  • Django 中从 sqlite 迁移到 postgresql

    我想迁移自sqlite to PostgreSQL db 我安装了 postgresql 并在其 shell 上创建数据库 然后配置我的 django 设置如下 default ENGINE django db backends postg
  • Django 在 rss feed 中指定频道图像的方式

    在 rss feed 中指定频道图像的 django way 是什么 我可以通过滚动我自己的 xml 来手动完成此操作 但我正在寻找一种正确的方法来完成此操作 Editdobrych 的解决方案在这里不太适用 因为我具体询问的是 RSS 而
  • 如何将 max_length 添加到 allauth 用户名

    我使用 Django allauth 作为我的 Django 站点的用户帐户框架 文档显示有一个ACCOUNT USERNAME MIN LENGTH http django allauth readthedocs io en latest
  • 从 Django 调用 Postgres SQL 存储过程

    我正在开发一个带有 Postgresql 数据库的 Django 项目 我编写了一个可以在 Postgres 上完美运行的存储过程 现在我想从 Django 1 5 调用该存储过程 我已经编写了代码 但它提示错误 CREATE FUNCTI
  • 嵌套字典中的 Django 模板

    我正在使用 Django 模板 并且遇到了嵌套字典的一个问题 Dict result dict type 0 file name abc count 0 type 1 file name xyz count 50 我的 HTML 文件中的模
  • 将 transaction.commit_manually() 升级到 Django > 1.6

    我继承了为 Django 1 4 编写的应用程序的一些代码 我们需要更新代码库以使用 Django 1 7 并最终更新到 1 8 作为下一个长期支持版本 在一些地方它使用旧风格 transaction commit manually and
  • Django通用外键和select_相关

    我试图使用与通用外键的关系来选择模型 但它没有按预期工作 我认为用代码可以更好地说明和理解 class ModelA models Model created models DateTimeField auto now add True c
  • Python Django-如何从输入文件标签读取文件?

    我不想将文件保存在我的服务器上 我只想在下一页中读取并打印该文件 现在我有这个 index html
  • Django Rest Framework 删除 csrf

    我知道有关于 Django Rest Framework 的答案 但我找不到解决我的问题的方法 我有一个具有身份验证和一些功能的应用程序 我向其中添加了一个新应用程序 它使用 Django Rest Framework 我只想在这个应用程序
  • Heroku 上的 Django 翻译无法完全正常工作

    我在 Heroku 上部署了 Django 应用程序 并添加了https github com piotras heroku buildpack gettext git此 ugettext 构建包和应用程序的某些部分已注释翻译 本地可以用
  • 在 Python/Django 中将用户的 facebook/twitter 好友与网站用户进行比较

    我想知道是否有人可以帮助指导解决这个相当常见的问题的方法 我正在构建一个简单的网站 用户可以连接他们的 Twitter 帐户进行注册 我想创建一个界面 向他们显示哪些推特好友已经在使用该网站 因此 我可以获得用户的 Twitter 朋友列表
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini

随机推荐

  • 从 php 进行端口检查

    我正在尝试从 phplist 安装连接到 gmail pop 服务器 但失败了 但我不确定我的网站主机是否打开了端口 995 他们说他们已经打开了它 但我对此表示怀疑 有没有办法可以从 php 脚本检查它 他们在 Windows 服务器上运
  • 数组在 Java 内部是如何工作的?

    发布此查询是为了基本上了解诸如 对象是类实例或数组 数组是数组的子类Object class 在 Java 中 除原始类型之外的所有实例化对象都是对象 这是我对 Java 中数组的理解 考虑到下面的程序 dummy java class C
  • 如何将 Android 中的大型 pdf 文件加载到我的 web 视图中

    我无法将大型 pdf 文件 有 900 页 加载到我的 在我的 Android 应用程序中的 webview 我尝试了这段代码并且在任何 其他 pdf 但是当我尝试打开一个大的 pdf 时 它显示 无预览 可用的 wvReport getS
  • 从单独的脚本更新 WebExtension webRequest.onBeforeRequest 侦听器 URL 设置

    我目前正在创建一个 WebExtension 其中我在发出的 Web 请求上注册一个侦听器 如下所示 main js chrome webRequest onBeforeRequest addListener main function u
  • matlab脚本编辑

    我想在两种情况下编辑 matlab 脚本 1 在linux终端运行的matlab命令窗口中 如何创建和编辑脚本文件 使用 edit filename 将调用交互式编辑器 这在 Linux 服务器上运行时是不需要的 2 在emacs中 有没有
  • 在 JavaScript 中设置剃刀变量

    我正在尝试从 JavaScript 函数内将表单上的组合框的内容分配给剃刀变量 就像这样
  • 控制window.onbeforeunload事件

    出于好奇 我可以控制 window onbeforeunload 事件 例如检查用户是否决定离开页面或留在其中 我可以根据他的决定发出警报或某些功能吗 如果是 请告诉我 我知道 window onbeforeunload 是一个事件 向用户
  • 脚本标签 - 异步和延迟

    我有几个关于属性的问题async defer为了
  • 使用 Jquery 和 jgestures 在 Cordova 中滑动

    当涉及到使用 jQuery jQuery mobile 进行滑动时 Stackoverflow 中有很多主题 然而 它们似乎都没有按照我想要的方式工作 以下是我的phonegap应用程序的索引页面的结构 作为this主题推荐 我尝试了jge
  • 如何统计每个病人预约了多少名医生?

    我需要的结果如下 PatientID Doctors Patient1 3 Patient2 2 Patient3 1 预订的桌子是这样的 GPS Table PatientID DoctorID DATE Patient1 Doctor1
  • 如何从给定数据库中删除所有带有前缀“bkp”的表?

    我有一个 SQL Server 2005 在该服务器中我有 3 个数据库 gt a b c 如果我想删除表 仅来自数据库 c 的表 表的名称应以 bkp 开头 表应在一天前创建 尝试这个 USE C GO SELECT DROP TABLE
  • 我需要在 mysql 字段中查找并替换 \n

    我有这样的数据 1 街 n2 街 nmycity nmytown 我想要做的是将 n 替换为 char 10 因为我需要在 db 字段中进行真正的换行符 我有 UPDATE data set value REPLACE value n ch
  • 缓存阻塞实际上如何提高性能?

    我正在阅读有关缓存阻塞的内容这个英特尔页面 It says 阻塞是一种众所周知的优化技术 可以帮助避免许多应用程序中的内存带宽瓶颈 阻塞背后的关键思想是通过确保数据在多次使用时保留在缓存中来利用应用程序中可用的固有数据重用 提供一个例子 f
  • 我可以在 Intel Mac 上为 M1 Mac 构建 PyInstaller 二进制文件吗?

    I have recently found out that PyInstaller now works on macOS Monterey so I tried to build a binary When testing on my I
  • RXTX 串行连接 - 阻塞 read() 的问题

    我正在尝试使用 RXTX 库来阻止 Windows XP 和 7 上的串行通信 我已经测试了两端与超级终端的连接 它工作完美 我使用以下代码设置了连接 为了清楚起见 省略了异常处理和防御检查 private InputStream inSt
  • 按因子将比例列添加到数据框

    我正在尝试将一列添加到由按因子标准化的值组成的数据框中 例如 data frame 261 obs of 3 variables Area Factor w 29 levels Antrim Ards 1 1 1 1 1 1 1 1 1 2
  • matplotlib:颜色条及其文本标签

    我想创建一个colorbar传说heatmap 使得标签位于每个离散颜色的中心 从这里借来的例子 import matplotlib pyplot as plt import numpy as np from matplotlib colo
  • 如何将 HTML 文件加载到画布中?

    我知道我们可以将图像加载到画布中 但我想知道我们是否能够将简单的 HTML 文件加载到画布中 如果是 怎么办 Thanks Short answer No you cannot 长答案 不可靠 但是是的 你可以通过某些 可能是黑客的 方式
  • 面向对象的d3

    我有想要添加到 SVG 的数据对象 考虑以下伪片段 var data counter 0 for var col 1 col lt 5 col for var row 1 row lt 3 row data push id obj coun
  • 为什么 django 的 prefetch_lated() 只能与 all() 一起使用,而不能与 filter() 一起使用?

    假设我有这个模型 class PhotoAlbum models Model title models CharField max length 128 author models CharField max length 128 clas