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.
hombre, eres mi gurú django alrededor de estas partes, ya sabes todo –
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, 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