2010-01-06 4 views
0

Cela m'a toujours dérangé, et je n'ai jamais vraiment trouvé ma façon préférée de le faire.Quel est le moyen suggéré d'importer des modules dans un projet django

Lorsque vous importez quelque chose d'un de vos propres applications dans un projet django, importez-vous avec:

from myproject.mymodule.model import SomeModel 
from myproject.anotherone.model import AnotherModel 

ou, faites-vous:

from mymodule.model imoprt SomeModel 
from anotherone.model import AnotherModel 

Bien sûr, que ce soit va travailler Tant que vous définissez votre PYTHONPATH correctement lors du déploiement. Même une combinaison des deux dans un projet donné fonctionnera.

Mon problème avec le deuxième formulaire est lorsque vous avez un utils.py ou similaire assis dans votre projet.

# This feels wrong 
import utils 

Mais, ça pourrait être moi.

Lequel est le meilleur et pourquoi?

Répondre

5

Je recommande d'utiliser la seconde alternative:

from mymodule.model import SomeModel 
from anotherone.model import AnotherModel 

Dans Django, il est recommandé d'écrire des applications réutilisables, que vous pouvez déployer dans plusieurs projets. La spécification du nom du projet nuirait à cette possibilité. Cela compliquerait même le cas où vous changiez simplement le nom du dossier de projet supérieur!

C'est la tradition que la plupart des applications django utilisent (par exemple, pinax, django contrib, etc.).

Pour plus de détails, vous devriez écouter DjangoCon 2008: Reusable Apps.

1

Je préfère utiliser autant que possible des importations absolues. La première raison est que les importations relatives sont sur le point de sortir en Python 3, donc il vaut mieux ne pas prendre cette habitude. (En fonction de la façon dont vous avez formulé la question, je suppose que vous avez placé les packages d'application dans votre package de projet.) La deuxième raison est que cela rend l'intention de ce que vous importez plus explicite.

Bien que mon absolu meilleur pratique est de ne pas mettre mes paquets d'application dans le package du projet. Ainsi, il est plus facile de déplacer les applications et lorsque vous utilisez des importations absolues dans le package, si vous utilisez la même application ultérieurement dans un projet nommé différemment, vous n'aurez pas à réécrire toutes les importations pour refléter le projet différent. prénom.

0

Comment emballez-vous vos modules normalement? Si vous les mettez tous dans le module "myproject", vous devriez continuer à le faire. Si ce n'est pas le cas, il n'y a aucune raison de commencer. Je ne vois pas comment être dans un projet Django a quelque chose à voir avec la question - si vous ne réutilisez pas le code, pourquoi s'embêter à séparer vos paquets? Mais en réalité, le plus important est que vous ne réfléchissez pas à la façon de regrouper et de distribuer vos bibliothèques dans un sens plus large. Même s'il ne s'agit que d'une collection de routines utilitaires pratiques, et que vous n'avez pas l'intention de les partager, vous devriez penser aux problèmes d'espace de noms. The Python Tutorial a une bonne discussion de base des concepts.

Questions connexes