Django: Model.objects.get завершается с ошибкой ImportError - PullRequest
1 голос
/ 29 мая 2011

У меня есть модель, которая представляет настройки в моей системе, и я использую ее из другой части моего приложения, так что импорт имеет 3 уровня WORKING CODE <- Module <- Model

Модель 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,)

Вот код, который я использую с

Модуль variables.py



from core.models.storage import Variables

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

Модуль config.py



  var = get_var('some_key')

Когда я использую этот материал из оболочки django, все работает хорошо, но когда я вызываю get_var функцию, у меня ImportError исключение

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

1 Ответ

0 голосов
/ 30 мая 2011

Избавьтесь от каталога моделей и поместите все ваши модели в файл models.py, если у вас нет ОЧЕНЬ веских причин не делать этого. Измените ваш импорт на from core.models import Variable (переименуйте ваш класс Variables в Variable - модели django должны называться как единственное, а не множественное число).

Проблема, вероятно, связана с тем, что ваши модели живут в пространствах имен, отличных от models; то есть. models.storage. Инфраструктура Django предполагает наличие определенных вещей в определенных местах. Если вы собираетесь помещать модели в отдельные пространства имен, как вы это делаете, вам следует импортировать их из файла __init__.py в модуле models. Не делайте этого снова, если только у вас нет веских причин.

Наконец, задавая вопросы такого рода, вы должны предоставить гораздо больше информации. Вы должны показать код всех соответствующих файлов. Вы должны предоставить подробную информацию о том, что вы сделали, что отличается от соглашения django (в данном случае это каталог моделей, а не файл models.py). Вы также должны отобразить соответствующие настройки из settings.py, в данном случае, ваши настройки INSTALLED_APPS. Вы также должны сообщить нам, какую версию django и python вы используете; это иногда актуально. Больше информации заранее намного лучше, чем меньше информации.

...