Python Django:ModelChoiceField和Django.setup()
如果我试图通过PyCharm运行测试,我会遇到此异常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
...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(…)
smodelcoocefield
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个测试文件。我想有一个解决方案