162 votes

Django - Aide à l'importation de modèles circulaires!

Je ne suis vraiment pas faire cela, donc si quelqu'un pourrait expliquer comment cela fonctionne, je serais très apprécier. J'ai deux applications, les Comptes et le Thème... voici ma liste de paramètres:

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

Dans les comptes, je suis en train de faire ceci:

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)

Et dans mon thème modèle:

  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 coups de pied sur l'erreur suivante:

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

Est-ce une espèce d'importation circulaire problème? J'ai essayé à l'aide d'un paresseux de référence, mais qui ne semble pas fonctionner non plus!

295voto

Ignacio Vazquez-Abrams Points 312628

Supprimez l'importation de Theme et utilisez plutôt le nom du modèle sous forme de chaîne.

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

77voto

Ranju R Points 131

Utilisez la fonction get_model de django.db.models conçue pour les importations de modèles paresseux.:

 MyModel = get_model('app_name', 'ModelName')
 

Dans ton cas:

 Theme = get_model('themes', 'Theme')
 

Maintenant, vous pouvez utiliser Theme

54voto

Bogatyr Points 12027

Quelque chose que je n'ai pas vu mentionné nulle part de façon suffisamment détaillée est comment bien formuler la chaîne à l'intérieur de ForeignKey lorsque le référencement d'un modèle dans une autre application. Cette chaîne doit être app_label.model_name. Et, très important, l' app_label n'est pas la totalité de la ligne dans INSTALLED_APPS, mais seulement la dernière composante de cela. Donc, si votre INSTALLED_APPS ressemble à ceci:

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

ensuite pour inclure une ForeignKey à un modèle dans app2 dans un app1 modèle, vous devez faire:

app2_themodel = ForeignKey('app2.TheModel')

J'ai passé un certain temps à essayer de résoudre une circulaire d'importation question (donc je ne pouvais pas juste from another.path.to.app2.models import TheModel) avant je suis tombé sur cela, google/DONC été d'aucune aide (tous les exemples qui avait seul composant les chemins de app), donc j'espère que cela aidera d'autres django débutants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X