Je ne comprends vraiment pas cela, donc si quelqu'un pouvait expliquer comment cela fonctionne, je l'apprécierais beaucoup. J'ai deux applications, Comptes et Thème ... voici ma liste de paramètres:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'accounts',
'themes',
)
Dans les comptes, j'essaye de faire ceci:
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)
Et dans mon modèle de thème:
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 supprime l'erreur suivante:
from themes.models import Theme
ImportError: cannot import name Theme
S'agit-il d'une sorte de problème d'importation circulaire? J'ai essayé d'utiliser une référence paresseuse, mais cela ne semble pas non plus fonctionner!
django
django-models
Hanpan
la source
la source
Account
partir du module oùTheme
est défini?Réponses:
Supprimez l'importation
Theme
et utilisez le nom du modèle comme chaîne à la place.la source
'themes.Theme'
, car c'est dans une application différente.Jusqu'à Django 1.7:
Utilisez la
get_model
fonction à partir dedjango.db.models
laquelle est conçue pour les importations de modèles paresseux:Dans ton cas:
Maintenant vous pouvez utiliser
Theme
Pour Django 1.7+:
la source
apps.get_model(app_label, model_name)
ouapps.get_model('app_label.model_name')
dans Django 1.7+Quelque chose que je n'ai vu mentionné nulle part avec suffisamment de détails est de savoir comment formuler correctement la chaîne à l'intérieur de ForeignKey lors du référencement d'un modèle dans une application différente. Cette chaîne doit être
app_label.model_name
. Et, plus important encore, leapp_label
n'est pas la ligne entière dans INSTALLED_APPS, mais seulement le dernier composant de celui-ci. Donc, si votre INSTALLED_APPS ressemble à ceci:puis pour inclure une ForeignKey à un modèle dans app2 dans un modèle app1, vous devez faire:
J'ai passé assez de temps à essayer de résoudre un problème d'importation circulaire (donc je ne pouvais pas juste
from another.path.to.app2.models import TheModel
) avant de tomber dessus, google / SO ne m'aidait pas (tous les exemples avaient des chemins d'application à composant unique), donc j'espère que cela aidera les autres les débutants de django.la source
Depuis Django 1.7, la bonne manière est de procéder comme suit:
Voir: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model
la source
apps.get_model('your_app_name.YourModel')
pratique pour une utilisation dans unmap
etc.