Django-원형 모델 가져 오기 문제


116

나는 이것을 정말로 얻지 못하고있다. 그래서 누군가 이것이 이것이 어떻게 작동하는지 설명 할 수 있다면 나는 그것을 대단히 감사 할 것이다. 두 가지 응용 프로그램, 계정 및 테마가 있습니다. 여기에 내 설정 목록이 있습니다.

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

이것은 일종의 순환 수입 문제입니까? 게으른 참조를 사용해 보았지만 작동하지 않는 것 같습니다!


1
순환 수입의 문제처럼 보입니다. 정의 된 Account모듈에서 가져와야하는 이유는 무엇 Theme입니까?
Dominic Rodger

죄송합니다. 내 테마 모델을 올바르게 붙여 넣지 않았습니다. 게시물을 업데이트했습니다. Stylesheet 클래스에서 사용하고 있습니다.
Hanpan 2010

답변:


213

가져 오기를 제거하고 Theme대신 모델 이름을 문자열로 사용하십시오.

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

5
실제로 'themes.Theme'다른 앱에 있으므로이어야 합니다.
Daniel Roseman

아, 효과가 있었는데, 전에 '테마'만 해봤는데 효과가 없었어요. 감사. 이런 방식으로 수행하는 데 어떤 종류의 성능 저하가 있습니까? 나는 :) 가능하면 비 게으른 내 검색을 계속하고 싶습니다
Hanpan

@ 다니엘 : 업데이트되었습니다. @ 한판 : 작은 것, 네. 하지만 한 번만.
Ignacio Vazquez-Abrams

56

Django 1.7까지 :

지연 모델 가져 오기를 위해 설계된 get_model기능을 사용하십시오 django.db.models. :

from django.db.models import get_model
MyModel = get_model('app_name', 'ModelName')

귀하의 경우 :

from django.db.models import get_model
Theme = get_model('themes', 'Theme')

이제 사용할 수 있습니다 Theme

Django 1.7+의 경우 :

from django.apps import apps
apps.get_model('app_label.model_name')

10
사용 apps.get_model(app_label, model_name)또는 apps.get_model('app_label.model_name') 장고 1.7+에서
phoibos

51

다른 앱에서 모델을 참조 할 때 ForeignKey 내부의 문자열을 올바르게 공식화하는 방법에 대해 충분히 자세히 언급하지 않은 부분이 있습니다. 이 문자열은이어야 app_label.model_name합니다. 그리고 매우 중요한 것은 app_labelINSTALLED_APPS의 전체 줄이 아니라 마지막 구성 요소 라는 것입니다. 따라서 INSTALLED_APPS가 다음과 같은 경우 :

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

그런 다음 app1 모델의 app2에있는 모델에 ForeignKey를 포함하려면 다음을 수행해야합니다.

app2_themodel = ForeignKey('app2.TheModel')

나는 순환 가져 오기 문제를 해결하기 위해 꽤 오랜 시간을 보냈습니다 (그래서 그냥 할 수 없었습니다 from another.path.to.app2.models import TheModel). 장고 초보자.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.