Usar modelos fuera de una vista

Para enviar correos electrónicos y otras cosas, uso código fuera del archivo views.py (demasiado código allí). Creé un archivo llamado "tools.py" en la carpeta de la aplicación donde empiezo

from django.shortcuts import render_to_response
from django.core.mail import send_mail

from mysite.myapp.models import MyModel

Con runserver, tengo un error ImportError: cannot import name MyModel

Esto es extraño ya que uso la misma importación en el archivo views.py y no hay problema...

Alguna idea ? Gracias

preguntado el 09 de marzo de 12 a las 15:03

2 Respuestas

Lo más probable es que tenga una importación circular. ¿Estás importando este archivo tools.py en tu myapp/models.py?

respondido 09 mar '12, 15:03

Sí. Uso una función definida en herramientas en un modelo, supongo que no debería haberlo hecho. - Martín Trigaux

Generalmente, las importaciones circulares indican un defecto de diseño. Si las herramientas necesitan modelos y los modelos necesitan herramientas, entonces realmente debería ser parte del mismo módulo. Entonces, sí, probablemente debería mover elementos relevantes a myapp/models.py. - Chris Pratt

Un par de cosas:

  • Asegúrate de tener tu init.py en la carpeta donde se encuentra su archivo "tools.py", esta es una razón común por la que es posible que no se encuentre algo.

Estoy trabajando en la configuración de algo que requiere algo muy similar a sus requisitos.

Si está tratando de tener esto como un proceso de encendido/apagado, por ejemplo, cronjob, trabajador, etc. Haga lo siguiente.

#!/usr/bin/env python
######################################################################### 
# Required DO NOT REMOVE
#########################################################################
import os
import sys

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "appname.settings")
#########################################################################

# Import My Models, or Run an Include to Handle Processing.
from app.models.model import *

# Do Stuff to Test ( I suggest a simple insert into the model or pull and return content )

Guarde este archivo en la misma carpeta en la que está guardado su "manage.py", puede llamarlo directamente y debería procesarse, puede configurar un cronjob para que se ejecute, etc. Esto le permite tener un poco menos de código como no ejecuta algunos de los procesos que ejecuta django antes de generar una vista desde el archivo urls.py.

Si esto no está claro, siéntase libre de comentar y editaré con corrección o más detalles.

Todo lo mejor

Respondido 07 Feb 14, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.