Eu realmente não estou entendendo isso, então se alguém pudesse explicar como isso funciona, eu apreciaria muito. Tenho dois aplicativos, Contas e Tema ... aqui está minha lista de configurações:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'accounts',
'themes',
)
Em contas, estou tentando fazer isso:
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)
E no meu modelo de tema:
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 está expulsando o seguinte erro:
from themes.models import Theme
ImportError: cannot import name Theme
É algum tipo de problema de importação circular? Tentei usar uma referência preguiçosa, mas também não parece funcionar!
django
django-models
Hanpan
fonte
fonte
Account
do módulo ondeTheme
está definido?Respostas:
Remova a importação de
Theme
e use o nome do modelo como uma string.fonte
'themes.Theme'
, pois está em um aplicativo diferente.Upto Django 1.7:
Use a
get_model
funçãodjango.db.models
projetada para importações de modelos preguiçosos:No seu caso:
Agora você pode usar
Theme
Para Django 1.7+:
fonte
apps.get_model(app_label, model_name)
ouapps.get_model('app_label.model_name')
no Django 1.7+Algo que não vi mencionado em nenhum lugar com detalhes suficientes é como formular adequadamente a string dentro de ForeignKey ao fazer referência a um modelo em um aplicativo diferente. Esta string precisa ser
app_label.model_name
. E, o mais importante,app_label
não é toda a linha no INSTALLED_APPS, mas apenas o último componente dela. Portanto, se o INSTALLED_APPS se parecer com isto:em seguida, para incluir uma ForeignKey em um modelo em app2 em um modelo app1, você deve fazer:
Passei um bom tempo tentando resolver um problema de importação circular (então não pude simplesmente
from another.path.to.app2.models import TheModel
) antes de me deparar com isso, google / SO não ajudou (todos os exemplos tinham caminhos de aplicativo de componente único), então espero que isso ajude outros novatos django.fonte
Já que o Django 1.7, a maneira correta é assim:
Veja: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model
fonte
apps.get_model('your_app_name.YourModel')
conveniente para uso emmap
etc.