2010-08-16 4 views
8

Poszłam za this example i działa świetnie, ale zastanawiam się, czy mogę umieścić wyjątek, tak, że kiedy jestem w administracji wszystkie obiekty pojawiają się (aktywne i nieaktywne). To może być proste, ale nie mogę znaleźć tego w dokumentach.Menedżer niestandardowy do filtrowania obiektów w witrynie, ale nie w trybie administratora?

Oto co mój menedżer wygląda teraz:

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

Odpowiedz

9

Istnieje kilka rozwiązań, które przychodzą do głowy:

  1. definiują co queryset użyć do listy zmian z ModelAdmin.queryset().

  2. zainstaluj 2 menedżerów w swoim modelu, pierwszy, który administrator znajdzie jako domyślny AFAIK.

    class SomeThing(models.Model): 
        objects = models.Manager() 
        shares = ShareManager() 
    
  3. dodać nową metodę na swoim menedżerem niestandardowy zwracającej aktywny tylko rzeczy i opuścić get_query_set jak to jest domyślnie.

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

Follow-up

Myślę, że najbardziej odpowiednim rozwiązaniem w przypadku byłoby łączenie # 1 i # 2 wariancji.

Ustaw niestandardowego menedżera jako objects, aby wszyscy mogli uzyskać do niego dostęp (myślę, że to powinno działać w przypadku problemu z ponownym użyciem), a także zainstalować domyślnego menedżera w swoim modelu i użyć go w ModelAdmin.queryset().

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

Powinienem również dołączyć przykład metody ModelAdmin.queryset(), więc oto jest.

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 

Uwaga linia qs = self.model.admin_objects.get_query_set() pracuje z admin_objects który jest wystąpienie zwykłego menedżera i zawiera niepublikowane przedmiotów.

Reszta tej implementacji metody queryset jest domyślną implementacją Django, która zwykle wywołuje qs = self.model._default_manager.get_query_set().

Mam nadzieję, że to trochę wyjaśni.

+0

Dzięki za wiele rozwiązań, pomaga mi to zrozumieć więcej. Kilka pytań: Dla # 1, jak mogę uzyskać wszystkie obiekty jako zestaw zapytań, jeśli zostawiam niestandardowy Menedżer w miejscu? # 2 i # 3 również działają, ale napotykam problemy, gdy używam aplikacji wielokrotnego użytku, takich jak queryset = TaggedItem.objects.get_by_model (Share, tag). – knuckfubuck

+0

Zapomniałem podać przykład metody 'queryset'. –

+0

Dziękuję za obserwację. Ta kombinacja działa świetnie. – knuckfubuck

Powiązane problemy