mi chiedevo se fosse possibile (e, in caso affermativo, come) per concatenare più gestori per produrre una serie di query che è influenzato sia dei singoli gestori. Mi spiego l'esempio specifico che sto lavorando su:Django Gestore concatenazione
ho più classi di modelli astratti che uso per fornire piccoli, funzionalità specifiche per gli altri modelli. Due di questi modelli sono un DeleteMixin e un GlobalMixin.
La DeleteMixin è definito come tale:
class DeleteMixin(models.Model):
deleted = models.BooleanField(default=False)
objects = DeleteManager()
class Meta:
abstract = True
def delete(self):
self.deleted = True
self.save()
Fondamentalmente si fornisce una pseudo-delete (bandiera soppresso) anziché effettivamente eliminare l'oggetto.
Il GlobalMixin è definito come tale:
class GlobalMixin(models.Model):
is_global = models.BooleanField(default=True)
objects = GlobalManager()
class Meta:
abstract = True
Esso consente a qualsiasi oggetto per essere definita come un oggetto globale o di un oggetto privato (ad esempio, un post pubblico/privato).
Entrambi questi hanno i loro propri manager che influenzano il set di query che viene restituito. Il mio DeleteManager filtra il set di query per restituire solo i risultati che hanno il flag eliminato impostato su False, mentre il GlobalManager filtra il set di query per restituire solo i risultati contrassegnati come globali. Ecco la dichiarazione per entrambi:
class DeleteManager(models.Manager):
def get_query_set(self):
return super(DeleteManager, self).get_query_set().filter(deleted=False)
class GlobalManager(models.Manager):
def globals(self):
return self.get_query_set().filter(is_global=1)
la funzionalità desiderata sarebbe quella di avere un modello di estendere entrambi questi modelli astratti e concedere la possibilità di restituire solo i risultati che sono entrambi non-cancellato e globale. Ho eseguito un test case su un modello con 4 istanze: uno era globale e non eliminato, uno era globale e cancellato, uno era non globale e non cancellato, e uno era non globale e cancellato. Se provo a ottenere i set di risultati come tali: SomeModel.objects.all(), ottengo istanze 1 e 3 (le due non eliminate - grandiose!). Se provo SomeModel.objects.globals(), ottengo un errore che DeleteManager non ha un globali (questo è supponendo il mio modello di dichiarazione è come tale:. SomeModel (DeleteMixin, GlobalMixin) Se io invertire l'ordine, I don' t ottenere l'errore, ma non filtra quelli cancellati). Se cambio GlobalMixin di allegare GlobalManager a variabili globali invece di oggetti (in modo che il nuovo comando sarebbe SomeModel.globals.globals()), ottengo casi 1 e 2 (i due globali), mentre il mio risultato previsto sarebbe quello di ottenere solo esempio 1 (il globale, non cancellato).
io non ero sicuro se qualcuno avesse eseguito in qualsiasi situazione simile a questo ed era venuto ad un risultato. O un modo per farlo funzionare nel mio attuale pensiero o una rielaborazione che fornisce la funzionalità che sto cercando sarebbe molto apprezzato. So che questo post è stato un po 'prolisso. Se sono necessarie ulteriori spiegazioni, sarei lieto di fornirle.
Edit:
ho postato la soluzione finale che ho usato per questo problema specifico di seguito. Si basa sul collegamento al QuerySetManager personalizzato di Simon.
che sembra aver fatto il trucco. Avrei dovuto sapere di concentrarmi maggiormente sul set di query e meno sul gestore. Ho pubblicato la mia soluzione finale come risposta, anche se ho scelto il tuo come il migliore. – Adam