假設我有這種模式:Django LEFT JOIN,高效?
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張專輯的名稱以‘的’啓動,然後給我所有這些相冊的照片」
在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 =專輯)
但對於MySQL而言並不好用,而且我被告知最好使用LEFT JOIN
,而不是使用WHERE ... IN (SELECT ...)
類型的查詢。
編輯
我發現了一個3 year old mailing list post about the problem。沒有解決方案。
A 6 year old bug report saying they won't fix it。除了「這不是它的工作原理」之外沒有其他理由。顯然它可能在RoR中。
這個工程!它使用'WHERE id IN(1,2,3,4,5,6)'而不是'LEFT JOIN',但足夠公平。現在我想將'prefetch_related()'鏈接到兩個相反的'ForeignKey'級別,但我會再次離開它。乾杯。 – Timmmm 2012-08-01 10:44:34