假设我有这个模型:
class PhotoAlbum(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
class Photo(models.Model):
album = models.ForeignKey('PhotoAlbum')
我想做这个查询:“找到 10 个名字以'The'开头的相册,然后给我这些相册中的所有照片。”
在 SQL 中,我可以这样做:
SELECT * FROM
(SELECT * FROM photoalbum WHERE title LIKE 'The%' LIMIT 10) AS selected_albums
LEFT JOIN photo ON photo.album_id = selected_albums.id
我的问题是,我怎样才能在 Django 中做到这一点?(不触发对每个专辑的查询!)我认为这是一个相当普遍的要求,我不敢相信没有办法做到这一点。
如果没有 Django-ey 方式,我将满足于“如何使用原始 SQL 在 Django 中实现它?”。
以下是一些不起作用的事情:
select_related()
; 那是向前ForeignKey
的关系,这是向后的。编辑:实际上这确实有效!至少对于一个级别的prefetch_related()
; 也适用于前向关系。ForeignKey
s。PhotoAlbum.photo_set
; 触发对每个专辑的查询。我得到的最接近的是:
相册 = PhotoAlbum.objects.all()[:10] 照片 = Photo.objects.filter(album__in=albums)
但遗憾的是,它在 MySQL 上不起作用,我被告知使用LEFT JOIN
's 比使用WHERE ... IN (SELECT ...)
它创建的类型查询更好。
编辑
我发现了一个关于这个问题的 3 岁邮件列表帖子。其中没有解决方案。
一个6 年前的错误报告说他们不会修复它。除了“这不是它的工作方式”之外,没有给出任何理由。显然,在 RoR 中是可能的。