Nie widzę różnicy w podklasowaniu obiektu models.manager
i przesłonięcia metody get_query_set
lub po prostu utworzeniu nowej metody w podklasie i zastosowaniu tej metody. Z tego powodu wziąłem przykład z książki django;modele podklasy. Menedżer
class MaleManager(models.Manager):
def get_query_set(self):
return super(MaleManager, self).get_query_set().filter(sex='M')
class FemaleManager(models.Manager):
def get_query_set(self):
return super(FemaleManager, self).get_query_set().filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
Dzięki temu mógłbym użyć; Person.women.all()
lub Person.men.all()
, aby pobrać cały obiekt modelu mężczyzn lub kobiet. Ale myślę, że podobną rzecz można osiągnąć bez przesłonięcia metody get_query_set
po prostu robiąc;
class MaleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
class FemaleManager(models.Manager):
def get_female(self):
return return self.filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
Teraz, dzięki temu, mogę pobrać wszystkie te obiekty za pomocą trochę techniki; Person.objects.get_male()
lub Person.objects.get_female()
. Ale nie ma żadnej subtelnej różnicy między tym, jak mogę pobrać obiekty, ale istnieje różnica w zakresie czytelności i użycia w pierwszym przypadku, podczas gdy druga jest znacznie łatwiejsza do zrozumienia i ma mniejszy kod. Robią one znaczną różnicę w kodowaniu i wzory? Drugie z drugim, co jeśli umieszczę obie metody wewnątrz tej samej klasy;
class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')
Jeżeli wszystko co masz to 2 metody, organizacja dała mając zupełnie oddzielny menedżer nie jest warta - nie wiem, dlaczego książka Django byłoby zaproponować FemaleManager i MaleManager w przeciwieństwie do get_females i metod get_males na pojedynczym menedżerze. –
To bardziej zależy od warstwy abstrakcji. Jeśli planujesz mieć 'PeopleManager', który po prostu oddziela ludzi według płci, druga opcja jest bardziej użyteczna. Jeśli w przyszłości na przykład 'FemaleManager' będzie miał metody takie jak' get_blondes() 'lub' get_married() 'to drugie podejście będzie bardziej odpowiednie. –