有幾種解決方案浮現在腦海中:
定義哪些查詢集與ModelAdmin.queryset()變更列表中使用。
在您的模型上安裝2個管理員,管理員發現的第一個將用作默認的AFAIK。
class SomeThing(models.Model):
objects = models.Manager()
shares = ShareManager()
上僅返回積極的東西您的自定義管理器時添加新的方法和離開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()
。
我希望這可以清理一些東西。
感謝您的多種解決方案,它幫助我瞭解更多。幾個問題: 對於#1,如果我離開自定義管理器,如何將所有對象作爲查詢集? #2和#3也可以工作,但是當我使用queryset = TaggedItem.objects.get_by_model(Share,tag)等可重用應用程序時遇到問題。 – knuckfubuck 2010-08-16 08:55:06
我忘了舉一個'queryset'方法的例子。 – 2010-08-16 14:21:32
謝謝你的跟進。組合效果很好。 – knuckfubuck 2010-08-16 18:58:13