2011-01-14 12 views
7

La función ForeignRelatedObjectsDescriptor.create_manager(...) de Django crea dinámicamente las clases RelatedManager y luego inicializa una instancia de la clase creada dinámicamente.Anulando los métodos relacionados con Django

Si quisiera anular el método RelatedManager.add(...), ¿cómo lo haría?

Las clases RelatedManager se crean en el archivo: django/db/models/fields/related.py.

Un ejemplo de cómo me gustaría utilizar una costumbre RelatedManager es ...

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

se agradecería cualquier sugerencia.

Respuesta

3

No estoy seguro de lo que necesita la anulación: el conjunto de preguntas predeterminado ya hace lo que desea.

Pero para responder a la pregunta, puede definir un Administrador personalizado en el modelo y establecer use_for_related_fields=True para asegurarse de que se usa como administrador automático. Consulte la documentación en controlling automatic Manager types.

+0

hombre, eres mi gurú django alrededor de estas partes, ya sabes todo –

+4

Esto no funciona. La creación de un Administrador personalizado que establece use_for_related_fields = True asegura que la superclase de RelatedManager es el Administrador personalizado. Sin embargo, la clase RelatedManager se define dinámicamente en el archivo especificado en mi pregunta y cualquier add() en el Administrador personalizado se reemplaza por la definición dinámica de RelatedManager. Puedo modificar add() de RelatedManager y agregar hooks self.pre_save() y self.post_save() para ser implementados dentro de Managers personalizados y luego enviar un parche a Django, pero me pregunto si hay una mejor forma en que no estoy conciente de. – brildum

+1

-1, ya que no funciona, el '_related_' en esa variable es solo un pedazo de historia y no tiene nada que ver con los administradores de los campos relacionados. – Evgeny

0

Creo que estoy teniendo el mismo problema.

Tengo un administrador personalizado que reemplaza self._db y get_query_set() para enrutarlo a diferentes bases de datos.

Creé dinámicamente una clase modelo, y tiene su conjunto _default_manager con mi administrador personalizado.

Esto funciona para la clase en sí, pero no para el campo relacionado (foreign o many2many), aunque sí configuré los conjuntos use_for_related_fields = True.

Para campo relacionado, añadiendo db_manager(dbname) (por ejemplo, record.managed_set.db_manager(dbname)) se puede fijar todo() método, pero no para add() método.

Para entender lo que quiero decir, ver este billete Django: http://code.djangoproject.com/ticket/13358

creo que funciona para all(), pero no add().

Cuestiones relacionadas