Foros del Web » Programando para Internet » Python »

Wrappers en Django

Estas en el tema de Wrappers en Django en el foro de Python en Foros del Web. Buenas noches amigos del foro. Estoy trabajando en un proyecto en Django y me he encontrado con un problema bastante interesante (al menos eso parece, ...
  #1 (permalink)  
Antiguo 17/08/2012, 16:29
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Wrappers en Django

Buenas noches amigos del foro. Estoy trabajando en un proyecto en Django y me he encontrado con un problema bastante interesante (al menos eso parece, espero que sea una tontería).
Resulta que, debido a que es un proyecto relativamente grande, la "API" sobre los modelos iba creciendo y creciendo haciendo engorroso el trabajo, por lo que decidí pasar a utilizar wrappers. Básicamente, si antes tenía una estructura así:
Código Python:
Ver original
  1. # models.py
  2.  
  3. class MyModel(models.Model):
  4.     prop1 = ...
  5.     prop2 = ...
  6.  
  7.     def f1(self):
  8.         pass
  9.     def f2(self):
  10.         pass
Ahora estoy así:
Código Python:
Ver original
  1. # models.py
  2.  
  3. class MyModel(models.Model):
  4.     prop1 = ...
  5.     prop2 = ...
  6.  
  7. # wrappers.py
  8.  
  9. from myapp import models
  10.  
  11.  
  12. class MyModel(models.MyModel):
  13.  
  14.     def f1(self):
  15.         pass
  16.     def f2(self):
  17.         pass
Lo cual me permite separar definición de funcionalidad. Sin embargo, a la hora de la verdad, myapp.wrappers.MyModel se convierte mágicamente en myapp.models.MyModel, y por tanto al intentar ejecutar f1 me da un AttributeError, pues el modelo no tiene ese método.
Mi pregunta es: ¿qué coj*#$@ está pasando ahí? ¿Se debe a que el modelo y el wrapper se llaman igual? ¿Hay algún fallo en mi razonamiento?
Saludos y gracias por la ayuda :)
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #2 (permalink)  
Antiguo 17/08/2012, 16:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Wrappers en Django

Creo que te falta poner abstract=True en la clase Meta.

Tal como viene en la documentación.

PD: Lo que estas haciendo no son wrappers, es herencia en plano o si usas varias clases en varios modelos entonces se llaman mixin.
  #3 (permalink)  
Antiguo 17/08/2012, 17:04
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Wrappers en Django

Ya probé eso, pero realmente al no estar en models.py tampoco sería necesario, creo yo.
PD: Tal y como lo uso se parece más a un Façade, pero era por darle algún nombre sencillo
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 20/08/2012, 07:43
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Wrappers en Django

¿no será problema de que se está llamando directamente a lo que está en el módulo models? Digo, es bastante probable que en algún lado tengas una llamada a tuaplicacion.models.MyModel en vez de a wrappers.MyModel
  #5 (permalink)  
Antiguo 20/08/2012, 15:19
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Wrappers en Django

Hey, gracias por responder, pero creo que no es ese el problema D: Esto es lo que dice el shell:
Código Python:
Ver original
  1. $ python manage.py shell
  2. Python 2.7.3 (default, Apr 20 2012, 22:44:07)
  3. [GCC 4.6.3] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. (InteractiveConsole)
  6. >>> from myapp.wrappers import MyModel
  7. >>> MyModel
  8. <class 'MyProject.myapp.models.MyModel'>
Sinceramente, sigo sin entender nada de lo que pasa, esto es bastante weird.
Saludos y gracias de todas maneras
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 20/08/2012, 17:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Wrappers en Django

Acabo de darme cuenta que lo estas haciendo al revés.

Lo que va en wrappers debería ir en models y lo que va en models debería ir en wrappers.

Osea la declaración de los campos debería de ir en wrappers y las funciones deberían ir en models.py

PD: Lo acabo de probar y si me funciono a mi.

PD2: Acabo de subir un proyecto de muestra.
Archivos Adjuntos
Tipo de Archivo: zip MyProyect.zip (5,4 KB (Kilobytes), 3 visitas)

Última edición por razpeitia; 20/08/2012 a las 17:31
  #7 (permalink)  
Antiguo 22/08/2012, 10:32
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Wrappers en Django

Gracias por la ayuda pero entre que seguramente el remedio sería peor que la enfermedad y que no puedo perder mucho tiempo he decidido hacerlo a la manera fácil:
Código:
/MyProject
  - /myapp
    - /models
      - __init__.py
      - models.py
      - wrappers.py
El único inconveniente que tiene es que en los "verdaderos" modelos (models.py) debo añadir app_label en la clase Meta de cada uno, y que ahora las rutas de los imports tienen un "models" de más, pero por lo demás todo funciona correctamente
Gracias de nuevo y que Python les guíe
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:01.