No veo ninguna diferencia al clasificar el objeto models.manager
y anular el método get_query_set
o simplemente crear un nuevo método en la clase secundaria y usar el método. Por la razón, he tomado el ejemplo del libro django;subclassing models.Manager
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()
Con esto podría usar; Person.women.all()
o Person.men.all()
para buscar el objeto modelo de hombres o mujeres. Pero, supongo que se puede lograr algo similar sin anular el método get_query_set
simplemente haciendo;
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()
Ahora, con esto, puedo buscar todos esos objetos con un poco de técnica como; Person.objects.get_male()
o Person.objects.get_female()
. Pero no hay una diferencia sutil entre cómo puedo obtener los objetos, pero hay diferencia en términos de legibilidad y uso en el primer caso, mientras que el segundo es mucho más fácil de entender y tiene un código menor. ¿Tienen alguna diferencia significativa en la codificación y el patrones ? La otra cosa con el segundo, ¿y si coloco ambos métodos dentro de una misma clase como;
class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')
Si todo lo que tiene es 2 métodos, la organización ofrecida por tener un administrador completamente separados no vale la pena - no sé por qué el libro de Django sugeriría una FemaleManager y MaleManager en contraposición a un get_females y métodos get_males en un solo gerente. –
Es más, depende de tu capa de abstracción. Si planeas tener 'PeopleManager' que simplemente separe las personas por género, la segunda opción es más útil. Si en el futuro, por ejemplo, 'FemaleManager' tendrá métodos como' get_blondes() 'o' get_married() ', entonces el segundo enfoque será más adecuado. –