Naprawdę tego nie rozumiem, więc gdyby ktoś mógł wyjaśnić, jak to działa, byłbym bardzo wdzięczny. Mam dwie aplikacje, konta i motyw ... oto moja lista ustawień:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'accounts',
'themes',
)
Na kontach próbuję to zrobić:
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)
A w moim modelu motywu:
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 wyrzuca następujący błąd:
from themes.models import Theme
ImportError: cannot import name Theme
Czy to jakiś problem z importem w obiegu zamkniętym? Próbowałem użyć leniwego odniesienia, ale to też nie działa!
django
django-models
Hanpan
źródło
źródło
Account
z modułu, w którymTheme
jest zdefiniowane?Odpowiedzi:
Usuń import
Theme
i zamiast tego użyj nazwy modelu jako ciągu.źródło
'themes.Theme'
, ponieważ jest w innej aplikacji.Upto Django 1.7:
Użyj
get_model
funkcji, zdjango.db.models
której jest przeznaczona do leniwego importu modeli .:W Twoim przypadku:
Teraz możesz użyć
Theme
Dla Django 1.7+:
źródło
apps.get_model(app_label, model_name)
lubapps.get_model('app_label.model_name')
w DjangoCoś, czego nie widziałem, o czym nigdzie nie wspomniałem wystarczająco szczegółowo, to sposób prawidłowego sformułowania ciągu wewnątrz ForeignKey podczas odwoływania się do modelu w innej aplikacji. Ten ciąg musi być
app_label.model_name
. I, co bardzo ważne,app_label
nie jest to cała linia w INSTALLED_APPS, ale tylko jej ostatni składnik . Więc jeśli Twoje INSTALLED_APPS wygląda tak:następnie aby dołączyć klucz obcy do modelu w app2 w modelu app1, należy wykonać:
Spędziłem sporo czasu próbując rozwiązać problem z importem cyklicznym (więc nie mogłem po prostu
from another.path.to.app2.models import TheModel
), zanim natknąłem się na to, Google / SO nie pomogło (wszystkie przykłady miały ścieżki aplikacji z jednym komponentem), więc mam nadzieję, że pomoże to innym nowicjusze django.źródło
Od Django 1.7 poprawnym sposobem jest takie postępowanie:
Zobacz: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model
źródło
apps.get_model('your_app_name.YourModel')
wygodna do użycia wmap
itp.