2010-01-22 7 views
2

Je pense que c'est plus une question python que Django.ImportError: Références du modèle A Références du modèle B, du modèle B Modèle A

Mais au fond, je fais au modèle A:

from myproject.modelb.models import ModelB 

et au modèle B:

from myproject.modela.models import ModelA 

Résultat:

cannot import name ModelA

que je fais quelque chose d'interdit? Merci

+1

dupe http://stackoverflow.com/questions/744373/python-cyclic-imports –

+0

Je n'ai pas trouvé la réponse à mon problème, pourrais-je obtenir de l'aide s'il vous plaît? Ce que je fais n'est pas possible? – Clash

Répondre

6

Un module Python est importé en l'exécutant de haut en bas dans un nouvel espace de noms. Lorsque le module A importe le module B, l'évaluation de A.py est suspendue jusqu'à ce que le module B soit chargé. Lorsque le module B importe le module A, il obtient l'espace de noms partiellement initialisé du module A - dans votre cas, il manque la classe ModelA car l'importation de myproject.modelb.models se produit avant la définition de cette classe.

Dans Django, vous pouvez résoudre ce problème en vous référant à un modèle par son nom plutôt que par son objet. Ainsi, au lieu de dire

from myproject.modela.models import ModelA 
class ModelB: 
    a = models.ForeignKey(ModelA) 

que vous utilisez (sans l'importation):

class ModelB: 
    a = models.ForeignKey('ModelA') 
+0

Merci beaucoup Thomas! Sauvé ma journée! Par ailleurs, je pense que la syntaxe de 'a = models.ForeignKey ('ModelA')' est 'models.ForeignKey ('module.model')', c'est comme ça que ça a fonctionné pour moi! – Clash

2

les importations mutuelles signifient généralement que vous avez conçu vos modèles de manière incorrecte.

Quand A dépend de B, vous ne devriez pas avoir B également en fonction A.

Pause B en deux parties.

B1 - dépend A.

B2 - ne dépend pas de A.

A dépend de B1. B1 dépend de B2. Circularité supprimée.

+0

Merci pour votre réponse! Une personne participe au maximum à un projet, un projet n'a qu'un seul leader. Comment supprimez-vous la circularité de cela? Personne fait référence à un projet. Références de projet son leader (personne) – Clash

+0

@Clash: Les relations plusieurs-à-plusieurs ne requièrent pas des deux côtés de référencer explicitement l'autre. Vous pouvez le faire dans l'un des deux. Et. Pourquoi sont-ils dans des modules séparés? –

+0

S. Lott, ce n'est pas une relation many-to-many, une personne appartient à un projet et un projet a un leader – Clash