2011-05-29 4 views
1

j'ai modèle qui représente les paramètres dans mon système et je l'utilise d'une autre partie de ma demande afin que l'importation a 3 niveaux WORKING CODE <- Module <- ModelDjango: Model.objects.get échoue à l'exception ImportError

Modèle Variables

 


from django.db import models 

class Variables(models.Model): 
    key = models.CharField(max_length = 20, verbose_name = 'Variable') 
    value = models.CharField(max_length = 1024) 

    class Meta: 
     app_label = 'core' 

    def __unicode__(self): 
     return '%s: %s' % (self.key, self.value,) 
 

est le code que je suis ici à l'utiliser de

Module variables.py

 


from core.models.storage import Variables 

def get_var(name): 
    return Variables.objects.get(key = name) 
 

Module config.py

 


    var = get_var('some_key') 
 

Quand j'utilise ce genre de choses de django shell tout fonctionne bien, mais quand je l'appelle get_var fonction que j'ai ImportError exception

storage.py

 


from django.db import models 

class Variables(models.Model): 
    key = models.CharField(max_length = 20, verbose_name = 'Variable') 
    value = models.CharField(max_length = 1024) 

    class Meta: 
     app_label = 'core' 

    def __unicode__(self): 
     return '%s: %s' % (self.key, self.value,) 
 
 


    File "monitor_cli.py", line 19, in 
    print worker.get_provider() 
    File "/home/sultan/Project/monitor/app/worker.py", line 14, in get_provider 
    print Variables.objects.get(pk=1) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 132, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 341, in get 
    clone = self.filter(*args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 550, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 568, in _filter_or_exclude 
    clone.query.add_q(Q(*args, **kwargs)) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1172, in add_q 
    can_reuse=used_aliases, force_having=force_having) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1060, in add_filter 
    negate=negate, process_extras=process_extras) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1226, in setup_joins 
    field, model, direct, m2m = opts.get_field_by_name(name) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 307, in get_field_by_name 
    cache = self.init_name_map() 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 337, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 414, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/options.py", line 428, in _fill_related_many_to_many_cache 
    for klass in get_models(): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 167, in get_models 
    self._populate() 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 61, in _populate 
    self.load_app(app_name, True) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/loading.py", line 76, in load_app 
    app_module = import_module(app_name) 
    File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module 
    __import__(name) 
ImportError: No module named c 
 
+0

Pouvez-vous s'il vous plaît poster l'intégralité de votre fichier models.py? Cela a probablement quelque chose à voir avec une autre partie du fichier. Essayez de faire 'de core.models import *' et voyez ce qu'il se passe. –

+0

Accrochez-vous. Avez-vous un répertoire de modèles avec des fichiers dedans? Y a-t-il une raison pour laquelle vous n'avez pas de fichier models.py avec tous vos modèles définis dedans? –

+0

@Josh Smeaton oui j'ai le répertoire des modèles avec les fichiers modèles – sultan

Répondre

0

Get débarrasser du répertoire des modèles, et mettre tout ce que vous r modèles dans un fichier models.py, sauf si vous avez une très bonne raison de ne pas le faire. Changez vos importations en from core.models import Variable (renommez votre classe Variables en Variable - les modèles django doivent être nommés au singulier et non au pluriel).

Le problème a probablement à voir avec le fait que vos modèles vivent dans des espaces de noms autres que models; c'est à dire. models.storage. L'infrastructure django s'attend à ce que certaines choses soient à certains endroits. Si vous souhaitez placer des modèles dans des espaces de noms distincts comme vous le faites, vous devez les importer du fichier __init__.py dans le module models. Ne faites pas cela, encore une fois, sauf si vous avez une très bonne raison. Enfin, lorsque vous posez des questions de cette nature, vous devriez fournir beaucoup plus d'informations. Vous devriez montrer le code de tous les fichiers pertinents. Vous devez fournir des détails sur ce que vous avez fait qui s'écarte de la convention de django (dans ce cas, un répertoire models plutôt qu'un fichier models.py). Vous devez également afficher les paramètres pertinents de settings.py, dans ce cas, votre paramètre INSTALLED_APPS. Vous devriez également nous dire quelle version de django et python vous utilisez; c'est parfois pertinent. Plus d'informations à l'avance est beaucoup mieux que moins d'informations.

+0

Quels sont les problèmes si j'ai dix modèles, par exemple. 20 et je dois les séparer avec des fichiers séparés? – sultan

+0

J'ai tous les modèles dans models.py. J'obtiens la même erreur (fonctionne pour .all() mais échoue pour .get (pk = 1)). –

+0

@sultan, vous n'avez pas besoin de les séparer en plusieurs fichiers. Pour des raisons d'organisation, vous pourriez vouloir. Comprenez les conséquences de le faire en premier, sans le faire aveuglément. Vérifiez la source django pour des exemples (et regardez le fichier '__init __. Py' dans le répertoire models si vous le faites). Maintenant que vous avez tous vos modèles dans un fichier, supprimez les exemples de code précédents de votre question et publiez le contenu de models.py et vos paramètres INSTALLED_APPS. –

Questions connexes