2017-08-30 3 views
1

Je lisais django docs et ces deux classes semblait similaire,gestionnaire de modèle django ou django queryset

ici est l'échantillon de django docs:

class PersonQuerySet(models.QuerySet): 
    def authors(self): 
     return self.filter(role='A') 

    def editors(self): 
     return self.filter(role='E') 

class PersonManager(models.Manager): 
    def get_queryset(self): 
     return PersonQuerySet(self.model, using=self._db) 

    def authors(self): 
     return self.get_queryset().authors() 

    def editors(self): 
     return self.get_queryset().editors() 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    role = models.CharField(max_length=1, choices=(('A', _('Author')), ('E', _('Editor')))) 
    people = PersonManager() 

Dans l'exemple de code que vous pouvez voir code PersonQuerySet peut être déplacé à PersonManager (ou déplacer le gestionnaire à l'ensemble de requêtes) - mon point est que je peux fusionner les uns aux autres sans aucun problème)

alors quelle est la différence entre manager et queryset? ont-ils différents cas d'utilisation? ou devrais-je simplement en utiliser un et ignorer l'existence de l'autre?

Répondre

1

C'est un peu bizarre. Fondamentalement, si vous voulez écrire des méthodes personnalisées dans votre QuerySet et vous voulez être en mesure d'y accéder via la classe Manager vous avez également à également les implémenter dans la classe Manager. Ce qui n'est pas génial car ce n'est pas très DRY pour Django qui essaie d'être aussi DRY que possible, d'où l'assistant as_manager(). Par conséquent, pour répondre à votre question, il ne s'agit pas de deux cas différents, mais plutôt d'un cas particulier où vous souhaitez utiliser vos méthodes QuerySet personnalisées via un gestionnaire personnalisé.