Django-проблема импорта круговой модели



Я действительно не понимаю, так что если кто-то может объяснить, как это работает, я очень ценю это. У меня есть два приложения, учетные записи и темы... вот мой список настроек:



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


Это какой-то круговой вопрос импорта? Я пробовал использовать ленивую ссылку, но это не кажется работать!

575   4  

4 ответов:

удалить импорт Theme и использовать имя модели в качестве строки вместо этого.

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

то, что я нигде не видел достаточно подробно, - это как правильно сформулировать строку внутри ForeignKey при ссылке на модель в другом приложении. Эта строка должна быть app_label.model_name. И, что очень важно,app_label не вся строка в INSTALLED_APPS, а только последний компонент его. Так что если ваш INSTALLED_APPS выглядит так:

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

затем, чтобы включить внешний ключ к модели в app2 в модели app1, необходимо делать:

app2_themodel = ForeignKey('app2.TheModel')

Я потратил довольно много времени, пытаясь решить проблему кругового импорта (так что я не мог просто from another.path.to.app2.models import TheModel) прежде чем я наткнулся на это, google/SO не помог (все примеры имели однокомпонентные пути приложения), поэтому, надеюсь, это поможет другим новичкам django.

использовать

Так как Django 1.7 правильный путь должен идти так:

from django.apps import apps

YourModel = apps.get_model('your_app_name', 'YourModel')

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

Comments

    Ничего не найдено.