Django – Problema de importación de modelo circular

Realmente no entiendo esto, así que si alguien pudiera explicar cómo funciona esto, lo agradecería muchísimo. Tengo dos aplicaciones, Cuentas y Tema … aquí está mi lista de configuraciones:

INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'accounts', 'themes', ) 

En las cuentas, estoy tratando de hacer esto:

 from themes.models import Theme class Account(models.Model): ACTIVE_STATUS = 1 DEACTIVE_STATUS = 2 ARCHIVE_STATUS = 3 STATUS_CHOICES = ( (ACTIVE_STATUS, ('Active')), (DEACTIVE_STATUS, ('Deactive')), (ARCHIVE_STATUS, ('Archived')), ) id = models.AutoField(primary_key=True) name = models.CharField(max_length=250) slug = models.SlugField(unique=True, verbose_name='URL Slug') status = models.IntegerField(choices=STATUS_CHOICES, default=ACTIVE_STATUS, max_length=1) owner = models.ForeignKey(User) enable_comments = models.BooleanField(default=True) theme = models.ForeignKey(Theme) date_created = models.DateTimeField(default=datetime.now) 

Y en mi modelo de tema:

 class Theme(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=250) slug = models.SlugField(unique=True, verbose_name='URL Slug') date_created = models.DateTimeField(default=datetime.now) class Stylesheet(models.Model): id = models.AutoField(primary_key=True) account = models.ForeignKey(Account) date_created = models.DateTimeField(default=datetime.now) content = models.TextField() 

Django está echando el siguiente error:

 from themes.models import Theme ImportError: cannot import name Theme 

¿Es esto algún tipo de problema de importación circular? Intenté usar una referencia perezosa, ¡pero eso tampoco parece funcionar!

Elimine la importación de Theme y use el nombre del modelo como una cadena en su lugar.

 theme = models.ForeignKey('themes.Theme') 

Algo que no he mencionado en ningún lugar con suficiente detalle es cómo formular correctamente la cadena dentro de ForeignKey al hacer referencia a un modelo en una aplicación diferente. Esta cadena necesita ser app_label.model_name . Y, muy importante, la app_label no es toda la línea en INSTALLED_APPS, sino solo el último componente de la misma. Entonces, si INSTALLED_APPS se ve así:

 INSTALLED_APPS = ( ... 'path.to.app1', 'another.path.to.app2' ) 

luego, para incluir una clave externa a un modelo en la aplicación 2 en un modelo de aplicación1, debe hacer lo siguiente:

 app2_themodel = ForeignKey('app2.TheModel') 

Pasé bastante tiempo tratando de resolver un problema de importación circular (por lo que no pude simplemente from another.path.to.app2.models import TheModel ) antes de tropezar con esto, google / SO no fue de ayuda (todos los ejemplos tenían rutas de aplicaciones de componente único), así que con suerte esto ayudará a otros novatos django.

Use la función get_model de django.db.models que está diseñada para las importaciones de modelo perezoso .:

 MyModel = get_model('app_name', 'ModelName') 

En tu caso:

 Theme = get_model('themes', 'Theme') 

Ahora puedes usar Theme

Como la forma correcta de Django 1.7 es seguir así:

 from django.apps import apps YourModel = apps.get_model('your_app_name', 'YourModel') 

Ver: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model