Estoy agregando algunas funcionalidades extendidas a mis modelos en Django. Para no sobrecargar la interfaz raíz del modelo (y el archivo), estoy usando algunos ayudantes como atributos del modelo.
Lo que quiero es agrupar los métodos y propiedades en estos ayudantes, y lo que quiero es algo como:
class Product(models.Model): downloads = DownloadsHelper() # .... pass p = Product.objects.first() p.downloads.files_count(p) p.downloads.reset_permissions(p) # ...Para no tener que pasar la instancia al ayudante cada vez, podría usar otro enfoque.
class Product(models.Model): def __init__(self, *args, **kwargs): super(Product, self).__init__(*args, **kwargs) self.downloads = DownloadsHelper(self) self.shipping = ShippingHelper(self) p = Product.objects.first() p.downloads.files_count p.downloads.reset_permissions()Y finalmente, una forma más genérica/conceptual de Python para hacer esto sería como:
class Helper: def __init__(self, helped): self.helped = helped class Helper1(Helper): attribute_name = 'helloing' def hola(self): print("hola") class Helper2(Helper): attribute_name = 'goodbying' def chau(self): print("chau") class Helped: def __init__(self): self._install_helpers() def _install_helpers(self): for helper in self.helpers: setattr(self, helper.attribute_name, helper(self)) class MyHelped(Helped): helpers = [Helper1, Helper2] h = MyHelped() h.helloing.hola() h.goodbying.chau()Y la pregunta es: ¿Es este último enfoque una forma correcta/una buena práctica para hacer las cosas desde un punto de vista pythonic-OOP y "Djangoid". ¿Tiene esto algún problema?
¡Gracias por leer!
Tal vez no mostraste la complejidad total de tus métodos, pero por lo que mostraste podría simplificarse un poco.
Podría usar la herencia "directa/simple", y si tiene muchos métodos, para la organización, tal vez podría prefijar los nombres de los métodos con h1_ y h2_ para indicar de qué clase de ayuda son:
from django.db import models class Helper1: def h1_hola(self): print("hola") class Helper2: def h2_chau(self): print("chau") class MyHelped(Helper1, Helper2, models.Model): pass h = MyHelped() h.h1_hola() h.h2_chau()¿Este enfoque más simple sería suficiente para sus necesidades específicas?