Python Django:ModelChoiceField和Django.setup()

Python Django:ModelChoiceField和Django.setup(),python,django,django-settings,Python,Django,Django Settings,如果我试图通过PyCharm运行测试,我会遇到此异常 ...bin/python /usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py ...src/foo/foo/tests/FooEditTest.py::FooEditTest::test_issue_add true Testing started at 15:59 ... Traceback (most recent call last): File "/usr/local/pyc

如果我试图通过PyCharm运行测试,我会遇到此异常

...bin/python /usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py ...src/foo/foo/tests/FooEditTest.py::FooEditTest::test_issue_add true
Testing started at 15:59 ...
Traceback (most recent call last):
  File "/usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py", line 139, in <module>
    module = loadSource(a[0])
  File "/usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py", line 41, in loadSource
    module = imp.load_source(moduleName, fileName)
  File "...src/foo/foo/tests/FooEditTest.py", line 45, in <module>
    from foo.views.issue.forward import forward
  File "...src/foo/foo/views/issue/forward.py", line 29, in <module>
    class ForwardForm(forms.Form):
  File "...src/foo/foo/views/issue/forward.py", line 36, in ForwardForm
    group=forms.ModelChoiceField(Group.objects.exclude(groupconfig__no_issue=True).extra(
  File "...python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "...python2.7/site-packages/django/db/models/query.py", line 698, in exclude
    return self._filter_or_exclude(True, *args, **kwargs)
  File "...python2.7/site-packages/django/db/models/query.py", line 707, in _filter_or_exclude
    clone.query.add_q(~Q(*args, **kwargs))
  File "...python2.7/site-packages/django/db/models/sql/query.py", line 1331, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File "...python2.7/site-packages/django/db/models/sql/query.py", line 1358, in _add_q
    current_negated=current_negated, connector=connector)
  File "...python2.7/site-packages/django/db/models/sql/query.py", line 1182, in build_filter
    lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
  File "...python2.7/site-packages/django/db/models/sql/query.py", line 1120, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "...python2.7/site-packages/django/db/models/sql/query.py", line 1383, in names_to_path
    field, model, direct, m2m = opts.get_field_by_name(name)
  File "...python2.7/site-packages/django/db/models/options.py", line 416, in get_field_by_name
    cache = self.init_name_map()
  File "...python2.7/site-packages/django/db/models/options.py", line 445, in init_name_map
    for f, model in self.get_all_related_m2m_objects_with_model():
  File "...python2.7/site-packages/django/db/models/options.py", line 563, in get_all_related_m2m_objects_with_model
    cache = self._fill_related_many_to_many_cache()
  File "...python2.7/site-packages/django/db/models/options.py", line 577, in _fill_related_many_to_many_cache
    for klass in self.apps.get_models():
  File "...python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
    result = user_function(*args, **kwds)
  File "...python2.7/site-packages/django/apps/registry.py", line 168, in get_models
    self.check_models_ready()
  File "...python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

Process finished with exit code 1
…bin/python/usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py…src/foo/foo/tests/FooEditTest.py::FooEditTest::test\u issue\u add true
测试在15:59开始。。。
回溯(最近一次呼叫最后一次):
文件“/usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py”,第139行,中
模块=加载源(a[0])
文件“/usr/local/pycharm-4.5.1/helpers/pycharm/utrunner.py”,第41行,在loadSource中
module=imp.load\u源(moduleName,文件名)
文件“…src/foo/foo/tests/FooEditTest.py”,第45行,在
从foo.views.issue.forward导入转发
文件“…src/foo/foo/views/issue/forward.py”,第29行,在
类转发表单(forms.Form):
文件“…src/foo/foo/views/issue/forward.py”,第36行,格式为ForwardForm
group=forms.ModelChoiceField(group.objects.exclude(groupconfig\u no\u issue=True)。额外(
文件“…python2.7/site packages/django/db/models/manager.py”,第92行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“…python2.7/site packages/django/db/models/query.py”,第698行,在exclude中
返回self.\u filter\u或\u exclude(True、*args、**kwargs)
文件“…python2.7/site packages/django/db/models/query.py”,第707行,在过滤器或排除中
clone.query.add_q(~q(*args,**kwargs))
文件“…python2.7/site packages/django/db/models/sql/query.py”,第1331行,在add_q中
子句,require\u inner=self.\u add\u q(其中,self部分,self.used\u别名)
文件“…python2.7/site-packages/django/db/models/sql/query.py”,第1358行,在
电流_否定=电流_否定,连接器=连接器)
文件“…python2.7/site packages/django/db/models/sql/query.py”,第1182行,内置过滤器
查找、部件、引用\u聚合=self.solve\u查找\u类型(arg)
文件“…python2.7/site packages/django/db/models/sql/query.py”,第1120行,为solve_lookup_类型
_,字段,\,查找\u parts=self.names\u to\u path(查找\u拆分,self.get\u meta())
文件“…python2.7/site packages/django/db/models/sql/query.py”,第1383行,位于names\u-to\u路径中
字段,模型,直接,m2m=opts。按名称(名称)获取字段
文件“…python2.7/site packages/django/db/models/options.py”,第416行,按名称获取字段
cache=self.init\u name\u map()
文件“…python2.7/site packages/django/db/models/options.py”,第445行,在init_name_映射中
对于f,在self中建模。使用模型()获取所有相关对象:
文件“…python2.7/site packages/django/db/models/options.py”,第563行,在get\u所有与\u相关的\u m2m\u对象\u和\u模型中
cache=self.\u fill\u related\u many\u to\u many\u cache()
文件“…python2.7/site packages/django/db/models/options.py”,第577行,在“填充”相关的“多到多”缓存中
对于self.apps.get_models()中的klass:
文件“…python2.7/site packages/django/utils/lru_cache.py”,第101行,在包装器中
结果=用户函数(*args,**kwds)
get_模型中的第168行文件“…python2.7/site packages/django/apps/registry.py”
self.check_models_ready()
文件“…python2.7/site packages/django/apps/registry.py”,第131行,在check\u models\u ready中
raise AppRegistryNotReady(“尚未加载模型”)
django.core.exceptions.AppRegistryNotReady:尚未加载模型。
进程已完成,退出代码为1
我使用
group=forms.ModelChoiceField(group.objects.exclude(…)
这一行在导入过程中执行。对
django.setup()
的调用以前没有执行过

我不知道如何解决这个问题:

  • 我应该调用
    django.setup()
    ?但是在哪里插入这一行呢
  • 在导入期间避免使用
    MyModel.objects.filter(…)
    ?这需要一个大的重构,因为我们有几个
    modelcoocefield
    s

我在运行测试用例时遇到了同样的问题,并通过在测试文件的开头使用导入语句将其添加到测试文件中来解决

import os
import sys

from django.core.handlers.wsgi import WSGIHandler

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = WSGIHandler()

在没有看到您的代码的情况下有点难说,但我曾经遇到过类似的问题。对我来说,它与一个模块有关,该模块由我的模型导入,并且还包含我的模型的导入

ModelA--导入-->服务--导入-->ModelA


我通过将服务中的导入移动到需要导入的方法来解决此问题。因此,我没有将其放在服务模块的顶部,而是将导入的范围限制到需要此导入的方法,从而避免在初始化服务模块时导入模型。FWW,我希望我能为您绘制它:)

请显示准确的代码(尤其是
extra()
子句)。在导入时调用
filter()
exclude()
并不坏,因为查询集是惰性的,但您可以在此处计算导致异常的查询集


在导入期间不要评估查询集,因为导入语句只执行一次:例如,如果创建了一个新组,它将不能作为ModelChoiceField的选择。

您当前正在使用PyCharm的Python单元测试运行程序运行测试
PyCharm-4.5.1/helpers/PyCharm/utrunner.py
。 此测试运行程序非常适合于低级单元测试(从
unittest.TestCase
中派生),这些测试不涉及诸如ORM之类的Django特性,但是 如果测试依赖于Django特定的东西,比如数据库,那么您的测试用例可能需要从
Django.test.TestCases.TestCase
中进行子类化,并且您需要通过PyCharm的Django测试管理器
Django\u test\u manage.py
,它负责设置测试数据库,初始化模型注册表,等等

运行>编辑配置>添加新配置(+按钮)>Django测试


将目标设置为
foo.foo.tests.FooEditTest
,如果找不到您的设置,请确保将
DJANGO\u设置\u模块=…
放在环境变量中。

我有大约500个测试文件。我想有一个解决方案