升级到Django 1.3后ManyToMany出现FieldError
我刚刚把Django更新到了1.3版本,遇到了一个奇怪的错误。之前在1.2.7版本上能正常工作的代码,现在出现了以下错误。
FieldError: Cannot resolve keyword 'email_config_set' into field. Choices are: id, name, site, type
奇怪的是,email_config_set是一个多对多字段的相关名称。我不明白为什么Django会试图把它解析成一个字段。
这个错误发生在Django的内部深处:
Traceback (most recent call last):
File "./core/driver.py", line 268, in run
self.init_norm()
File "./driver/emailevent/background.py", line 130, in init_norm
self.load_config()
File "./driver/emailevent/background.py", line 71, in load_config
events = list(config.events.select_related())
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/manager.py", line 168, in select_related
return self.get_query_set().select_related(*args, **kwargs)
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/fields/related.py", line 497, in get_query_set
return superclass.get_query_set(self).using(db)._next_is_sticky().filter(**(self.core_filters))
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/query.py", line 568, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/sql/query.py", line 1194, in add_q
can_reuse=used_aliases, force_having=force_having)
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/sql/query.py", line 1069, in add_filter
negate=negate, process_extras=process_extras)
File "/usr/local/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/models/sql/query.py", line 1260, in setup_joins
"Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'email_config_set' into field. Choices are: id, name, site, type
如果有任何建议或提示,我都会很感激。
1 个回答
1
这个问题是因为动态模型和它们的创建顺序引起的。具体来说,有些模型是在其他模型之后动态创建的,这些模型在填充_meta缓存时还没有定义,因此就会导致错误。清除缓存或者改变创建顺序可以解决这个问题。
另见 https://groups.google.com/d/msg/django-users/RJlV5_ribZk/P6tv4QlJN4EJ