2010-03-03 8 views
5

Ich habe den Standardmanager für einige der Objekte geändert, die GenericForeignKey() so referenzieren kann, dass diese Objekte nicht mehr in diesem Standardmanager angezeigt werden.Verwenden eines nicht standardmäßigen Managers mit GenericForeignKey()

Ich habe andere Manager, die in der Lage sein werden, diese gelöschten Objekte zu finden, aber ich sehe keine Möglichkeit, das Content-Typen-Framework über sie zu erzählen. Ist das möglich?

ich mit einigen Modellen ‚weichen Lösch‘ bin die Umsetzung, die folgenden Manager beinhalten:

from django.db import models 

SDManager(models.Manager): 

    def get_query_set(self): 
     return super(SDManager, self).get_query_set().filter(is_deleted=False) 

SDDeletedManager(models.Manager): 

    def get_query_set(self): 
     return super(SDDeletedManager, self).get_query_set().filter(is_deleted=True) 

Dies ermöglicht es mir folgend zu tun:

SDModel(models.Model): 
    # ... 
    objects = SDManager() # Only non (soft) deleted objects 
    all_objects = models.Manager() # The default manager 
    deleted_objects = SDDeletedManager() # Only (soft) deleted objects 

Wenn ein GenericForeignKey() Feld in einem Modell Um auf ein Objekt wie SDModel zu verweisen, verwendet es das Attribut _default_manager, das den Manager objects auswertet, um die Referenz zu erhalten. Dies bedeutet, dass es Referenzen verliert, wenn Objekte weich gelöscht werden.

Dies war einer der Hauptgründe, die ich GenericForeignKey() Felder verwendet habe. Eine Lösung, die ich überfräste, implementiert eine geringere Version des Frameworks für Inhaltstypen, so dass ich meine eigene get_object() definieren kann, die den Manager all_objects verwendet, um auf das Referenzobjekt zuzugreifen.

Also wirklich meine Frage ist:

Ist es möglich, einen Nicht-Standard-Manager mit dem vorhandenen Inhaltstypen Rahmen zu verwenden, so dass es die weichen gelöschte Objekte findet, oder werde ich wieder umsetzen müssen alle Teile, die ich von Grund auf neu brauche?

+0

Möglicherweise müssen Sie detailliertere Beispiele eingeben und Beispielcode veröffentlichen. – stefanw

+0

Ich habe mehr Details hinzugefügt, um Ihnen eine klarere Vorstellung von meinem Dilemma zu geben. –

+0

Entschuldigung, wenn ich etwas offensichtliches verpasse, aber hast du darüber nachgedacht, "Objekte" als Standard-Modelle zu behalten.Manager und Benennung des SDManagers etwas anderes? d. h. die Definitionen für Objekte und all_objects austauschen? –

Antwort

2

Ich habe genau das gleiche Problem wie Sie, und nach dem Tauchen in die Dokumentation/Quelle sieht es aus wie Django zu tun dies nicht eine aus dem Kasten heraus Art und Weise bereitzustellen. Die einfachste Methode, die ich gefunden habe, war die Unterklasse GenericForeignKey und dann die Methode zu überschreiben.

The troublesome line ist, wo es nennt:

rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field)) 

Also diese Zeile neu geschrieben werden muss, wie:

rel_obj = ct.model_class().all_objects.get(pk=getattr(instance, self.fk_field)) 

es ein wenig hackish ist, aber es funktioniert, und Sie dann die volle Nutzung bekommen Macht von GenericForeignKey, wie Sie es normalerweise tun würden.

Verwandte Themen