2011-01-14 5 views
7

Die Funktion ForeignRelatedObjectsDescriptor.create_manager(...) von Django erstellt dynamisch die Klassen RelatedManager und initialisiert anschließend eine Instanz der dynamisch erstellten Klasse.Überschreiben von Djangos Methoden des zugehörigen Managers

Wenn ich die RelatedManager.add(...) Methode überschreiben wollte, wie würde ich es tun?

Die Klassen RelatedManager werden in der Datei django/db/models/fields/related.py erstellt.

Ein Beispiel, wie ich RelatedManager eine benutzerdefinierte verwenden möchten ist ...

class Record(Model): 
    string = CharField() 
class Managed(Model): 
    record = ForeignKey('Record') 
    boolean = BooleanField() 
def view_function(...): 
    record = Record(string='Example') 
    record.save() 
    record.managed_set.add(Managed(boolean=True)) # How to override add()? 

würde geschätzt Irgendwelche Vorschläge.

Antwort

3

Ich bin mir nicht sicher, was Sie für die Überschreibung benötigen - das Standard-Abfrage-Set tut bereits, was Sie wollen.

Um die Frage zu beantworten, können Sie einen benutzerdefinierten Manager für das Modell definieren und use_for_related_fields=True festlegen, um sicherzustellen, dass es als automatischer Manager verwendet wird. Siehe die Dokumentation unter controlling automatic Manager types.

+0

Mann, du bist mein Django Guru um diese Teile herum, du weißt alles –

+4

Das funktioniert nicht. Durch Erstellen eines benutzerdefinierten Managers, der use_for_related_fields = True festlegt, wird sichergestellt, dass die Oberklasse des RelatedManager der benutzerdefinierte Manager ist. Die RelatedManager-Klasse wird jedoch dynamisch in der Datei definiert, die in meiner Frage angegeben ist, und jedes add() im benutzerdefinierten Manager wird von der dynamischen Definition von RelatedManager überschrieben. Ich kann die add() - Funktion von RelatedManager ändern und die Self-Prefixes() und Self.post_save() hinzufügen, um sie in benutzerdefinierten Managern zu implementieren und dann einen Patch an Django zu senden, aber ich frage mich, ob es einen besseren Weg gibt bewusst. – brildum

+1

-1 Da es nicht funktioniert, ist das "_related_" in dieser Variable nur ein Stück Geschichte und hat nichts mit Managern verwandter Felder zu tun. – Evgeny

0

Ich denke, ich habe das gleiche Problem.

Ich habe einen benutzerdefinierten Manager, der self._db und get_query_set() überschreibt, um es an verschiedene Datenbanken zu leiten.

ich erstellt dynamisch ein Modell Klasse und hat seine _default_manager Set mit meiner benutzerdefinierten Manager.

Dies funktioniert für die Klasse selbst, aber nicht für verwandte Feld (fremd oder many2many), obwohl ich Set use_for_related_fields = True gesetzt habe.

Für verwandten Bereich, Anfügen db_manager(dbname) (zB record.managed_set.db_manager(dbname)) alle() Verfahren beheben, aber nicht für add() Methode.

Um zu verstehen, was ich meine, sehen Sie dieses django Ticket: http://code.djangoproject.com/ticket/13358

Ich denke, es ist für all() funktioniert, aber nicht add().

Verwandte Themen