Django 相关模型无法解析
Posted
技术标签:
【中文标题】Django 相关模型无法解析【英文标题】:Django Related model cannot be resolved 【发布时间】:2015-12-23 14:55:45 【问题描述】:我有两个 django/python 应用程序,一个在 Django 1.8 和 Python 3.4 上运行,另一个在 Django 1.8 和 Python 2.7 上运行。这些应用程序共享一个数据库并使用一个 python 包,其中包含几个模型,这些模型在几个不同的应用程序中的两个应用程序之间共享。
在 3.4 上运行的应用程序工作正常,但在 2.7 上运行的应用程序抛出 ValueError: Relate Model 'model_reference' cannot be resolved。
在这个伪示例中,包是 core_app,这两个模型位于 core_app 中名为 foobar 和 barfoo 的单独应用程序中。
foobar/models.py
class Model_A(models.Model):
name = TextField()
barfoo/models.py
class Model_B(models.Model):
model_a = ForeignKey('core_app_foobar.Model_A')
这是完整的堆栈跟踪。
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/manager.pyc in manager_method(self, *args, **kwargs)
125 def create_method(name, method):
126 def manager_method(self, *args, **kwargs):
--> 127 return getattr(self.get_queryset(), name)(*args, **kwargs)
128 manager_method.__name__ = method.__name__
129 manager_method.__doc__ = method.__doc__
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/query.pyc in get(self, *args, **kwargs)
326 if self.query.can_filter():
327 clone = clone.order_by()
--> 328 num = len(clone)
329 if num == 1:
330 return clone._result_cache[0]
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/query.pyc in __len__(self)
142
143 def __len__(self):
--> 144 self._fetch_all()
145 return len(self._result_cache)
146
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/query.pyc in _fetch_all(self)
963 def _fetch_all(self):
964 if self._result_cache is None:
--> 965 self._result_cache = list(self.iterator())
966 if self._prefetch_related_lookups and not self._prefetch_done:
967 self._prefetch_related_objects()
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/query.pyc in iterator(self)
236 # Execute the query. This will also fill compiler.select, klass_info,
237 # and annotations.
--> 238 results = compiler.execute_sql()
239 select, klass_info, annotation_col_map = (compiler.select, compiler.klass_info,
240 compiler.annotation_col_map)
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in execute_sql(self, result_type)
827 result_type = NO_RESULTS
828 try:
--> 829 sql, params = self.as_sql()
830 if not sql:
831 raise EmptyResultSet
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in as_sql(self, with_limits, with_col_aliases, subquery)
376 refcounts_before = self.query.alias_refcount.copy()
377 try:
--> 378 extra_select, order_by, group_by = self.pre_sql_setup()
379 if with_limits and self.query.low_mark == self.query.high_mark:
380 return '', ()
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in pre_sql_setup(self)
46 might not have all the pieces in place at that time.
47 """
---> 48 self.setup_query()
49 order_by = self.get_order_by()
50 extra_select = self.get_extra_select(order_by, self.select)
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in setup_query(self)
37 if all(self.query.alias_refcount[a] == 0 for a in self.query.tables):
38 self.query.get_initial_alias()
---> 39 self.select, self.klass_info, self.annotation_col_map = self.get_select()
40 self.col_count = len(self.select)
41
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in get_select(self)
185 if self.query.default_cols:
186 select_list = []
--> 187 for c in self.get_default_columns():
188 select_list.append(select_idx)
189 select.append((c, None))
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/sql/compiler.pyc in get_default_columns(self, start_alias, opts, from_parent)
522 alias = self.query.join_parent_model(opts, model, start_alias,
523 seen_models)
--> 524 column = field.get_col(alias)
525 result.append(column)
526 return result
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in get_col(self, alias, output_field)
2015
2016 def get_col(self, alias, output_field=None):
-> 2017 return super(ForeignKey, self).get_col(alias, output_field or self.related_field)
2018
2019
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in related_field(self)
1895 @property
1896 def related_field(self):
-> 1897 return self.foreign_related_fields[0]
1898
1899 def get_reverse_path_info(self):
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in foreign_related_fields(self)
1629 @property
1630 def foreign_related_fields(self):
-> 1631 return tuple(rhs_field for lhs_field, rhs_field in self.related_fields)
1632
1633 def get_local_related_value(self, instance):
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in related_fields(self)
1616 def related_fields(self):
1617 if not hasattr(self, '_related_fields'):
-> 1618 self._related_fields = self.resolve_related_fields()
1619 return self._related_fields
1620
/home/ubuntu/moi/local/lib/python2.7/site-packages/django/db/models/fields/related.pyc in resolve_related_fields(self)
1601 raise ValueError('Foreign Object from and to fields must be the same non-zero length')
1602 if isinstance(self.rel.to, six.string_types):
-> 1603 raise ValueError('Related model %r cannot be resolved' % self.rel.to)
1604 related_fields = []
1605 for index in range(len(self.from_fields)):
ValueError: Related model 'core_app_foobar.Model_A' cannot be resolved
【问题讨论】:
是自我关系吗? 对不起,这是示例代码中的错字。 Model_B 正在引用 Model_A 【参考方案1】:试试看:
class Model_B(models.Model):
model_a = ForeignKey('foobar.Model_A')
不要忘记从 django 模型继承。 (两者)
from django.db import models
要引用另一个应用程序中定义的模型,您可以显式 指定具有完整应用程序标签的模型。例如,如果 上面的制造商模型在另一个应用程序中定义,称为 生产,你需要使用:
Doc ForeignKey
【讨论】:
模型继承不是问题,这是简化示例中的错误。如果这是问题所在,那么引发的错误将会有所不同。此外,该模型使用完整的应用程序标签指定,并且如上所述在运行 1.8/3.4 的应用程序中工作正常,此问题仅在运行 1.8/2.7 的应用程序中出现。 那么您的问题措辞错误,因为显然他们看到的第一个问题是您的应用名称与导入的名称不同。 正如我在第二句话中所说的,这个问题的重点是这个包在运行 3.4 的应用程序中运行良好,而问题出现在运行 2.7 的应用程序上。 当我读到这个'但应用程序'在 2.7 上运行时抛出 ValueError:我认为代码不同。不过没关系,你完全有权投反对票。 我投了反对票,因为这个答案并不能解决这个问题,任何可能遇到类似问题的用户都不会通过这些来解决它。伪代码中的错字是我的错误,我已经更正,现在它们在语法上是正确的。不过我很感激你的努力。【参考方案2】:您可以通过以下方式之一进行操作-
在barfoo/models.py
-
1)
from django.db import models
class Model_B(models.Model):
model_a = models.ForeignKey('foobar.Model_A')
2)
from django.db import models
from core_app.foobar import models as foobar_models
class Model_B(models.Model):
model_a = models.ForeignKey(foobar_models.Model_A)
【讨论】:
他不需要这个。查看文档。 docs.djangoproject.com/en/1.8/ref/models/fields/…他不需要导入模型。以上是关于Django 相关模型无法解析的主要内容,如果未能解决你的问题,请参考以下文章
Django:无法解析相关模型“users.UserProfile”
ValueError: 运行测试时无法解析相关模型 u'app.model'
无法使用视图名称 (django-rest-framework) 解析超链接关系的 URL