2010-08-16 6 views
8

J'ai suivi this example et cela fonctionne très bien mais je me demande si je peux mettre une exception de sorte que quand je suis dans l'admin tous les objets apparaissent (actifs et inactifs). Cela peut être simple mais je ne trouve pas comment le faire dans les docs.Custom Manager pour filtrer les objets sur le site mais pas dans l'admin?

Voici ce que mon manager ressemble maintenant:

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

Répondre

9

Il existe plusieurs solutions qui viennent à l'esprit:

  1. définissent ce queryset à utiliser pour la liste des modifications avec ModelAdmin.queryset().

  2. installez 2 gestionnaires sur votre modèle, le premier que admin trouve sera utilisé par défaut AFAIK.

    class SomeThing(models.Model): 
        objects = models.Manager() 
        shares = ShareManager() 
    
  3. ajouter une nouvelle méthode sur votre gestionnaire personnalisé qui renvoie des choses seulement active et laisser get_query_set comme il est par défaut.

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

Suivi

Je pense que la solution la plus appropriée dans votre cas serait de combiner # 1 et # 2 de variation. Définissez votre gestionnaire personnalisé comme objects afin que tout le monde puisse y accéder (je pense que cela devrait fonctionner pour votre problème de réutilisabilité) et également installer le gestionnaire par défaut sur votre modèle et l'utiliser dans ModelAdmin.queryset().

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

J'ai inclus ModelAdmin.queryset() exemple de la méthode aussi, si elle est ici.

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 

Notez la ligne qs = self.model.admin_objects.get_query_set() travaille avec admin_objects qui est l'instance de gestionnaire simple et comprend des éléments inédits.

Le reste de cette implémentation de la méthode queryset est l'implémentation par défaut de Django qui appelle généralement qs = self.model._default_manager.get_query_set(). J'espère que cela éclaircira un peu les choses.

+0

Merci pour les solutions multiples, cela m'aide à mieux comprendre. Quelques questions: Pour le numéro 1, comment puis-je obtenir tous les objets en tant que jeu de requête si je laisse le gestionnaire personnalisé en place? # 2 et # 3 fonctionnent également, mais je rencontre des problèmes lorsque j'utilise des applications réutilisables comme queryset = TaggedItem.objects.get_by_model (Partager, tag). – knuckfubuck

+0

J'ai oublié de mettre un exemple de méthode 'queryset'. –

+0

Nous vous remercions de votre suivi. La combinaison fonctionne très bien. – knuckfubuck