30 votes

Impossible d'importer des modèles d'une autre application dans Django

J'ai donc 2 applications qui tournent dans le même projet.

Mes dossiers sont structurés comme suit :

/project_codebase
    /project
        __init.py
        settings.py
        urls.py
        wsgi.py
        ...    
    /app1
        ...
    /app2
        ...
    manage.py

Donc, pour une raison étrange, j'ai un nom différent pour mon répertoire de base (c'est-à-dire qu'il se termine par codebase). J'espère que ce n'est pas un problème.

En mi settings.py J'ai ceci :

INSTALLED_APPS = [
    ...

    'app1',
    'app2',
]

Ok, donc dans mon models.py (depuis app2) Je peux facilement importer des modèles de l'application 1 avec from app1.models import * Cependant, lorsque j'utilise from app2.models import * dans mon models.py (de l'application 1) J'obtiens une erreur d'importation (ImportError).

Des solutions à ce problème ?

68voto

jojo Points 777

Cela peut être dû à importation circulaire questions. Pour éviter cela, vous devez charger le modèle dynamiquement :

Pour versions récentes de django (1.7+) utiliser le registre des applications :

from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')

Pour versions antérieures de django (<1.7) :

from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')

Note 1 : Si vous souhaitez définir un Relation ForeignKey , il y a pas besoin d'une déclaration d'importation séparée . Django vous couvre sur ce point :

Si app1 est une application installée, vous devez définir la relation ForeignKey comme suit :

# in app2.py
class MyModel2(models.Model):
   mymodel1 = models.ForeignKey('app1.MyModel1')

Note 2 : Le get_model ne fonctionne que si app1 est une application installée et MyModel1 est le modèle que vous souhaitez importer à partir de app1 .

Note 3 : Essayez d'éviter les importations de caractères génériques ( from ... import * ), comme il s'agit d'une mauvaise pratique .

11voto

vishes_shell Points 10206

Il s'agit d'une importation circulaire.

Mais je pense que ce dont vous avez besoin, c'est d'utiliser les modèles comme une sorte de RetationFields( ForeignKey , ManyToManyField o OneToOneField ). Vous devez donc ignorer l'importation et l'utiliser comme suit :

# app1/models.py
class Model1(models.Model):
    relation_field = models.ForeignKey('app2.Model2')

En documents :

Si vous devez créer une relation sur un modèle qui n'a pas encore été défini, vous pouvez utiliser le nom du modèle, plutôt que l'objet modèle lui-même

Pour faire référence à des modèles définis dans une autre application, vous pouvez spécifier explicitement un modèle avec l'étiquette complète de l'application

Il suffit de mettre str comme premier argument des champs de relation qui conduisent à l'objet <app_name>.<Model_name> .

Note Il est préférable d'éviter d'importer tout ce qui provient du module( from <module_name> import * )

5voto

Ahmed Ginani Points 5360

Si vous souhaitez importer uniquement un module spécifique, n'utilisez pas l'option import * .

Cela prendra plus de temps pour charger votre bibliothèque et peut donc affecter la vitesse de votre application.

Si vous voulez utiliser quelques modules de votre deuxième application, ajoutez simplement le nom du module au lieu des bibliothèques entières, comme ceci :

from app2.models import Module1, Module2

ou il peut s'agir d'un problème d'importation circulaire, comme d'autres le précisent.

Merci.

3voto

youssef hassoun Points 137

J'utilise toujours ce code et il fonctionne :)

from position_app.models import Member

1voto

Terry Points 137

Vous devez spécifier les noms des modèles que vous souhaitez importer, par exemple from app1.models import ModelName1, ModelName2 .

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