2011-01-14 11 views
7

La funzione ForeignRelatedObjectsDescriptor.create_manager(...) di Django crea dinamicamente le classi RelatedManager e successivamente inizializza un'istanza della classe creata dinamicamente.Sovrascrittura dei metodi RelatedManager di Django

Se volevo ignorare il metodo RelatedManager.add(...), come dovrei farlo?

Le classi RelatedManager vengono create nel file: django/db/models/fields/related.py.

Un esempio di come mi piacerebbe utilizzare un costume RelatedManager è ...

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()? 

Tutti i suggerimenti sarebbero apprezzati.

risposta

3

Non sono sicuro di cosa sia necessario per l'override: il set di query predefinito esegue già ciò che si desidera.

Ma per rispondere alla domanda, è possibile definire un Manager personalizzato sul modello e impostare use_for_related_fields=True per assicurarsi che venga utilizzato come gestore automatico. Vedere la documentazione su controlling automatic Manager types.

+0

uomo, tu sei il mio django guru intorno a queste parti, sai tutto –

+4

Questo non funziona. Creazione di un gestore personalizzato che imposta use_for_related_fields = True garantisce che la superclasse di RelatedManager sia il gestore personalizzato. Tuttavia, la classe RelatedManager è definita dinamicamente nel file specificato nella mia domanda e qualsiasi add() nel gestore personalizzato è sovrascritta dalla definizione dinamica di RelatedManager. Potrei modificare l'add() di RelatedManager e aggiungere i ganci self.pre_save() e self.post_save() da implementare all'interno di Managers personalizzati e quindi inviare una patch a Django, ma mi chiedo se c'è un modo migliore in cui non sono consapevole di – brildum

+1

-1 poiché non funziona, il "_related_" in quella variabile è solo un pezzo di cronologia e non ha nulla a che fare con i gestori dei campi correlati. – Evgeny

0

Penso di avere lo stesso problema.

Ho un gestore personalizzato che sostituisce self._db e get_query_set() per indirizzarlo a diversi database.

Ho creato dinamicamente una classe modello e ha il suo _default_manager impostato con il mio gestore personalizzato.

Questo funziona per la classe stessa, ma non per il campo correlato (estraneo o molti2many), anche se ho impostato set use_for_related_fields = True.

Per campo correlato, aggiungendo db_manager(dbname) (ad esempio, record.managed_set.db_manager(dbname)) in grado di correggere tutti) metodo, ma non per add() il metodo (.

Per capire quello che voglio dire, si veda questo biglietto django: http://code.djangoproject.com/ticket/13358

penso che funziona per all(), ma non add().

Problemi correlati