假设我有这个模型:
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文档。
我接手了一个Sring MVC项目,需要改变它的行为,所以在我的servlet中我发送了一个get请求来自动登录,我的servlet代码如下所示: 当我用Firefox运行它时,它让我登录,但在IE中不起作用。 我还手动粘贴了URL: http://Example.com/SupportCenter/login.html?userName=UID 进入两个broswers,他们都让我登录。那么,为
https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?
我正在尝试使用mod_wsgi使我的django项目与httpd一起工作。但我一直收到一个“500内部服务器错误”。我正在使用PostgreSQL Postgis数据库。我的操作系统是Fedora 20。 真正奇怪的是: > 任何其他数据库(mysql、sqlite3..),例如: 这是我的django项目的httpd配置文件(假设它被称为)(我把这个文件放在中): 显然产生错误的项目设置部分()
为什么只适用于s而不适用于s?有什么特别的原因吗?
问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt
所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。