Django-Manager Verkettung

Ich Frage mich, ob es möglich war (und wenn ja, wie) miteinander zu verketten mehrere Manager zum erzeugen einer Abfrage, die betroffen ist, indem sowohl der einzelnen Manager. Ich erkläre das konkrete Beispiel, an dem ich arbeite:

Habe ich mehrere abstrakte Modell-Klassen, die ich verwenden, um kleine, spezifische Funktionen zu anderen Modellen. Zwei dieser Modelle sind die DeleteMixin und ein GlobalMixin.

Den DeleteMixin so definiert:

class DeleteMixin(models.Model):
    deleted = models.BooleanField(default=False)
    objects = DeleteManager()

    class Meta:
        abstract = True

    def delete(self):
        self.deleted = True
        self.save()

Im Grunde stellt es eine pseudo-löschen (deleted-flag), anstatt wirklich löschen des Objekts.

Den GlobalMixin so definiert:

class GlobalMixin(models.Model):
    is_global = models.BooleanField(default=True)

    objects = GlobalManager()

    class Meta:
        abstract = True

Es erlaubt jedes Objekt definiert werden, entweder als ein globales Objekt, oder ein eigenes Objekt (z.B. ein public/private-blog-post).

Beide haben Ihre eigenen Vorgesetzten, die Auswirkungen auf das queryset zurückgegeben wird. Meine DeleteManager Filter den queryset, um nur Ergebnisse zurück, die haben das gelöscht-flag auf False gesetzt, während die GlobalManager-Filter das queryset, um nur Ergebnisse zurück, die gekennzeichnet sind als global. Hier ist die Erklärung für beides:

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)

Die gewünschte Funktionalität wäre ein Modell verlängern sowohl der diese abstrakten Modelle und gewähren die Möglichkeit, nur die Ergebnisse, die sind beide nicht gelöscht und global. Ich lief einen test-Fall auf ein Modell mit 4 Instanzen: eine Globale und nicht gelöscht, man war global und gelöscht, war eine nicht-Globale und nicht-gelöscht, und einer nicht-globalen und gelöscht werden. Wenn ich versuche, zu bekommen Ergebnismengen als solche: SomeModel.Objekte.alle(), bekomme ich die Instanz 1 und 3 (die zwei nicht-gelöschten - toll!). Wenn ich versuche SomeModel.Objekte.globals(), bekomme ich eine Fehlermeldung, dass DeleteManager nicht ein globals (dies wird vorausgesetzt, mein Modell Deklaration ist wie folgt: SomeModel(DeleteMixin, GlobalMixin). Wenn ich die Bestellung stornieren, habe ich nicht den Fehler, es heißt aber nicht, filtern die gelöschten). Wenn ich GlobalMixin zu befestigen GlobalManager zu globals anstelle von Objekten (also den neuen Befehl wäre SomeModel.globals.globals()), bekomme ich die Instanzen 1 und 2 (die beiden globals), während meine beabsichtigten Ergebnis führen würde, werden nur get-Instanz 1 (die global, nicht gelöscht werden).

Ich war mir nicht sicher, ob jemand in eine situation ähnlich wie diese, und hatte kommen zu einem Ergebnis. Entweder ein Weg, um es Arbeit in meine aktuellen Gedanken oder ein re-Arbeit, liefert die Funktionalität, die ich mir nach dem würde sehr geschätzt werden. Ich weiß, dieser post hat ein wenig langatmig. Wenn mehr Erklärung notwendig ist, würde ich mich gerne zur Verfügung stellen.

Edit:

Habe ich geschrieben die schließliche Lösung, die ich verwendet, um dieses spezielle problem weiter unten. Es beruht auf den link zu Simon ' s custom QuerySetManager.

InformationsquelleAutor Adam | 2009-04-30
Schreibe einen Kommentar