2010-06-25 64 views
0

我有一個有多個站點的系統。系統中的每個用戶對象都會獲得一個與其關聯的Profile對象,該對象管理着哪些站點有權與之交互。該系統還有一個可以屬於多個站點的文章模型。因此,當用戶加載文章管理頁面時,我只希望他們看到分配給他們有權訪問的網站的文章。所以,我重寫的文章的管理類的查詢集法是這樣的:Django Admin Queryset方法覆蓋;執行查詢不佳

qs = model.objects.filter(sites__id__in=[x.id for x in user.get_profile().group_profile.allowed_sites.all()]).distinct() 

以用戶,讓他們可以訪問的網站,並拉動其文章站點分配是在該列表中。問題在於,一旦你獲得了幾十萬條文章,這個查詢就變成了一條真正的狗,並且由於模型本身很大而加劇了這個問題,這意味着Django正在提取大量數據並在大列列表上運行DISTINCT。

我正在尋找方法來改善它,但查詢集方法似乎並沒有給我很多。我最初嘗試使用QuerySet函數only()來只拉取需要繪製變更列表的列,但後來發現這導致模型的post_save信號在保存時不會觸發。我無法擺脫獨特的,因爲如果我這樣做,我會得到每個網站的多個結果:即,如果用戶可以看到網站A和網站B,並且文章屬於這兩個網站,查詢將返回文章兩次。

回答

1

如果你有一個ManyToMany關係,你不能擺脫distinct(),因爲必須爲每個實例進行多個連接。你可以對你的查詢做些事情(儘管我不認爲這會帶來很大的性能提升),你不必做'__in'查詢ID:

qs = model.objects.filter(\ 
     sites__in=user.get_profile().group_profile.allowed_sites.all()).distinct() 
+0

正如你所說,這並不影響速度。 allowed_sites是一個小表(最多15個)的簡短列表。這是真正殺死它的特徵,或者至少是Django似乎迫使我拉動模型中的每一列,使得截然不同的比較。 – KRH 2010-06-29 16:56:00

+0

這是你想要的嗎? http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset – FallenAngel 2010-07-31 10:21:29