Я действительно не понимаю этого, поэтому, если бы кто-нибудь мог объяснить, как это работает, я был бы очень признателен. У меня есть два приложения, Аккаунты и Тема ... вот мой список настроек:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'accounts',
'themes',
)
В аккаунтах я пытаюсь это сделать:
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)
И в моей модели темы:
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 выдает следующую ошибку:
from themes.models import Theme
ImportError: cannot import name Theme
Это какая-то проблема с циклическим импортом? Я пробовал использовать ленивую ссылку, но это тоже не работает!
django
django-models
Hanpan
источник
источник
Account
из модуля, гдеTheme
определено?Ответы:
Удалите импорт
Theme
и используйте вместо этого название модели в виде строки.источник
'themes.Theme'
, потому что это в другом приложении.До Django 1.7:
Используйте
get_model
функцию,django.db.models
которая предназначена для ленивого импорта моделей:В твоем случае:
Теперь вы можете использовать
Theme
Для Django 1.7+:
источник
apps.get_model(app_label, model_name)
orapps.get_model('app_label.model_name')
в Django 1.7+То, что я нигде не упоминал достаточно подробно, - это то, как правильно сформулировать строку внутри ForeignKey при ссылке на модель в другом приложении. Эта строка должна быть
app_label.model_name
. И, что очень важно,app_label
это не вся строка в INSTALLED_APPS, а только ее последний компонент . Итак, если ваш INSTALLED_APPS выглядит так:затем, чтобы включить ForeignKey в модель в app2 в модели app1, вы должны сделать:
Я довольно долго пытался решить проблему с циклическим импортом (поэтому я просто не мог
from another.path.to.app2.models import TheModel
), прежде чем наткнулся на это, google / SO не помог (во всех примерах были пути к приложениям с одним компонентом), поэтому, надеюсь, это поможет другим django для новичков.источник
Поскольку Django 1.7 правильный путь - это сделать так:
См. Https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model
источник
apps.get_model('your_app_name.YourModel')
удобный для использования в иmap
т. Д.