2011-12-26 76 views
3

我使用了一個投票程序(Django的評級,如果有什麼差別),有一個ForeignKey到用戶等幾個領域,如最新的更改日期。Django的GenericForeignKey查找針對使用Django的GenericForeignKey一個給定的模型

我想獲得一個內容類型的所有對象,單個用戶投票支持最新變化的日期排序。據我瞭解 - 所有的信息都可以在單個表中找到(除了可以預取/緩存的content_type外)。不幸的是,每次請求content_object時,django仍然會生成額外的查詢。

所以,問題是 - 如何得到一個給定的模型所有的選票,由給定用戶,與相關對象並給予排序以最小的數據庫訪問?

編輯:現在我正在使用2個查詢 - 首先選擇所有投票,獲取所需的所有對象,通過.filter(pk__in = obj_ids)過濾,最後將它們填充到投票對象。但似乎一個​​可以幫助解決

回答

0

那麼現在我們在GenericRelation上使用django 1.4中的prefetch_related()。它仍然使用2個查詢,但有一個非常直觀的界面。

0

您檢查了select_related()問題?這可能有幫助。

返回一個QuerySet,它將自動「關注」外鍵關係,並在執行其查詢時選擇其他相關對象數據。這是一種性能提升,它會導致(有時很多)更大的查詢,但意味着以後使用外鍵關係不需要數據庫查詢。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

+0

不幸的是select_related不能與GFK afaik一起工作 – teferi 2011-12-26 20:02:07

0

通過觀察the models.py of the django-ratings app,我想你會做user.votes.filter(content_type__model=Model._meta.module_name).order_by("date_changed")(假設要篩選由模型是Model)讓所有的Vote對象。對於相關對象,遍歷每個項目上獲取content_object的查詢集。恕我直言,這會導致最少的數據庫查詢。

+0

這似乎是n + 1個查詢,其中n是用戶投票的對象的數量。這對我來說並不好。 – teferi 2011-12-26 20:09:31

相關問題