Non vedo alcuna differenza nella sottoclassificazione dell'oggetto models.manager
e sovrascrivendo il metodo get_query_set
o semplicemente creando un nuovo metodo nella sottoclasse e utilizzando il metodo. Per la ragione di aver preso esempio dal libro di Django;.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 questo potrei usare; Person.women.all()
o Person.men.all()
per recuperare tutti gli oggetti del modello maschile o femminile. Ma, immagino che la cosa simile possa essere ottenuta senza sovrascrivere il metodo get_query_set
semplicemente facendo;
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()
Ora, con questo, posso recuperare tutti quegli oggetti con una piccola tecnica come; Person.objects.get_male()
o Person.objects.get_female()
. Ma non c'è alcuna sottile differenza tra il modo in cui posso recuperare gli oggetti, ma c'è una differenza in termini di leggibilità e uso nel primo caso mentre il secondo è molto più facile da capire e ha un codice minore. Fanno alcune differenze significative nella codifica e modelli? L'altra cosa con la seconda, cosa succede se metto entrambi i metodi all'interno di una stessa classe come;
class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')
Se hai a disposizione solo 2 metodi, l'organizzazione offerta da avere un manager completamente separata non vale la pena - non so perché il libro Django suggerirebbe un FemaleManager e MaleManager al contrario di un get_females e metodi get_males su un singolo manager. –
Dipende più dal tuo livello di astrazione. Se stai pianificando di avere 'PeopleManager' che separa le persone per genere seconda opzione più utile. Se in futuro, ad esempio, 'FemaleManager' avrà metodi come' get_blondes() 'o' get_married() ', il secondo approccio sarà più adatto. –