Django - Vấn đề nhập khẩu mô hình tròn


116

Tôi thực sự không hiểu điều này, vì vậy nếu ai đó có thể giải thích cách hoạt động của nó, tôi sẽ rất cảm kích. Tôi có hai ứng dụng, Tài khoản và Chủ đề ... đây là danh sách cài đặt của tôi:

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

Trong tài khoản, tôi đang cố gắng thực hiện điều này:

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)

Và trong mô hình chủ đề của tôi:

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 đang phát ra lỗi sau:

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

Đây có phải là một số loại vấn đề nhập khẩu theo vòng tròn? Tôi đã thử sử dụng tham chiếu lười biếng, nhưng điều đó dường như cũng không hoạt động!


1
Nó trông giống như một vấn đề với nhập khẩu vòng tròn. Tại sao bạn cần nhập Accounttừ mô-đun Themeđược xác định?
Dominic Rodger

Xin lỗi, tôi đã không dán đúng mô hình Chủ đề của mình, tôi đã cập nhật bài đăng của mình. Tôi đang sử dụng nó trong lớp Biểu định kiểu.
Hanpan

Câu trả lời:


213

ThemeThay vào đó, hãy xóa việc nhập và sử dụng tên mô hình dưới dạng một chuỗi.

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

5
Thực ra điều đó cần phải 'themes.Theme'như vậy, vì nó nằm trong một ứng dụng khác.
Daniel Roseman

Ahh, điều đó đã hiệu quả, tôi đã thử chỉ 'Chủ đề' trước đó và nó không hoạt động. Cảm ơn. Có loại hiệu suất nào đạt được khi làm theo cách này không? Tôi muốn giữ tra cứu của tôi không lười biếng nếu có thể :)
Hanpan

@Daniel: Đã cập nhật. @Hanpan: Một cái nhỏ, vâng. Nhưng chỉ một lần.
Ignacio Vazquez-Abrams

56

Lên đến Django 1.7:

Sử dụng get_modelchức năng django.db.modelsđược thiết kế để nhập mô hình lười:

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

Trong trường hợp của bạn:

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

Bây giờ bạn có thể sử dụng Theme

Đối với Django 1.7+:

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

10
Sử dụng apps.get_model(app_label, model_name)hoặc apps.get_model('app_label.model_name') trong Django 1.7+
phoibos

51

Một cái gì đó mà tôi chưa thấy được đề cập ở bất kỳ nơi nào đầy đủ chi tiết là cách định dạng đúng chuỗi bên trong ForeignKey khi tham chiếu một mô hình trong một ứng dụng khác. Chuỗi này cần phải được app_label.model_name. Và, rất quan trọng, app_labelkhông phải là toàn bộ dòng trong INSTALLED_APPS, mà chỉ là thành phần cuối cùng của nó. Vì vậy, nếu INSTALLED_APPS của bạn trông giống như sau:

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

thì để đưa ForeignKey vào một mô hình trong app2 trong một mô hình app1, bạn phải thực hiện:

app2_themodel = ForeignKey('app2.TheModel')

Tôi đã mất khá nhiều thời gian để giải quyết vấn đề nhập vòng tròn (vì vậy tôi không thể chỉ from another.path.to.app2.models import TheModel) trước khi tôi tình cờ gặp phải vấn đề này, google / SO không giúp được gì (tất cả các ví dụ đều có đường dẫn ứng dụng thành phần duy nhất), vì vậy hy vọng điều này sẽ giúp ích cho người khác người mới django.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.