2010-08-16 57 views

回答

9

有幾種解決方案浮現在腦海中:

  1. 定義哪些查詢集與ModelAdmin.queryset()變更列表中使用。

  2. 在您的模型上安裝2個管理員,管理員發現的第一個將用作默認的AFAIK。

    class SomeThing(models.Model): 
        objects = models.Manager() 
        shares = ShareManager() 
    
  3. 上僅返回積極的東西您的自定義管理器時添加新的方法和離開get_query_set,因爲它是在默認情況下。

    class ShareManager(models.Manager): 
        def get_active_items(self): 
         return self.get_query_set().filter(active=True) 
    

後續

我覺得你的情況最合適的解決方案將被合併#1和#2的變化。

將您的自定義管理器設置爲objects,這樣每個人都可以訪問它(我認爲這應該適用於您的可重用性問題),並在您的模型上安裝默認管理器並在ModelAdmin.queryset()中使用它。

class SomeThing(models.Model): 
     objects = ShareManager() 
     admin_objects = models.Manager() 

我應該包括ModelAdmin.queryset()方法的例子,所以這裏。

def queryset(self, request): 
     qs = self.model.admin_objects.get_query_set() 
     # TODO: this should be handled by some parameter to the ChangeList. 
     # otherwise we might try to *None, which is bad ;) 
     ordering = self.ordering or() 
     if ordering: 
      qs = qs.order_by(*ordering) 
     return qs 

注行qs = self.model.admin_objects.get_query_set()正在與admin_objects 這是平原經理的實例,包括未公開的項目。

queryset方法的這個實現的其餘部分是默認的Django的實現,通常調用qs = self.model._default_manager.get_query_set()

我希望這可以清理一些東西。

+0

感謝您的多種解決方案,它幫助我瞭解更多。幾個問題: 對於#1,如果我離開自定義管理器,如何將所有對象作爲查詢集? #2和#3也可以工作,但是當我使用queryset = TaggedItem.objects.get_by_model(Share,tag)等可重用應用程序時遇到問題。 – knuckfubuck 2010-08-16 08:55:06

+0

我忘了舉一個'queryset'方法的例子。 – 2010-08-16 14:21:32

+0

謝謝你的跟進。組合效果很好。 – knuckfubuck 2010-08-16 18:58:13