【问题标题】:Django 1.8 - FieldError: Cannot resolve keyword into fieldDjango 1.8 - FieldError:无法将关键字解析为字段
【发布时间】:2015-10-30 03:22:01
【问题描述】:

我最近从 Django 1.6 升级到了 Django 1.8。当我这样做时,我发现我不再能够通过外键关系进行查找,如下所述: https://docs.djangoproject.com/en/1.8/topics/db/queries/#lookups-that-span-relationships.

系统设置为有两个项目使用同一个数据库。 (不是我的想法,但我现在不想更改。)最初创建和迁移模型的项目在升级后工作得很好,但另一个没有。每个的模型文件都是相同的。

模型.py:

class Site(models.Model):
    name = models.CharField(max_length=255)

    class Meta:
        app_label = 'project1'

class Page(models.Model):
    title = models.CharField(max_length=255)
    site = models.ForeignKey('Site')

    class Meta:
        app_label = 'project1'

来自 Django Shell 的错误回溯:

>>> x = models.Site.objects.filter(page__id=1000)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1314, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1342, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1154, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1035, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/home/user_name/project2/venv/local/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1401, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
FieldError: Cannot resolve keyword 'page' into field. Choices are: name, id

在第一个项目中,相同的查询按预期工作:

>>> x = models.Site.objects.filter(page__id=1000)
[<Site: http://stackoverflow.com>]

【问题讨论】:

  • 这是完整回溯吗?两个项目都有相同的 Django 版本?
  • 这是完整的回溯。这两个项目都是 Django 1.8.3
  • site = models.ForeignKey('Site', related_name='pages') 中设置一个related_name 并使用它进行查询。 Docs here
  • 这些模型是否在同一个应用中?
  • 模型在同一个应用中。

标签: django django-models


【解决方案1】:

我是 Django 新手,不知道这是否有帮助,但我遇到了同样的问题。就我而言,这是输入错误。

我之前写过这个:

Question.objects.filter(question_text_startswith='What')

在 Django 文档中,我注意到在查找 startswith 之前应该有 2 个下划线:

Question.objects.filter(question_text__startswith='What')

【讨论】:

    【解决方案2】:

    如果您在 `ForeignKey 上设置 related_name 会怎样?

    class Page(models.Model):
        site = models.ForeignKey('Site', related_name="pages")  # Note the related_name here
    

    我在另一个项目上尝试过,它按预期工作:

    >>> Site.objects.filter(pages__pk=42)
    [<Site: http://stackoverflow.com>]
    

    如果不设置related_name,我认为默认是&lt;model&gt;_set。所以应该是page_set

    【讨论】:

    • 我尝试输入相关名称,它并没有改变 project2 的结果,但它破坏了 project1。我开始收到FieldError: Cannot resolve keyword 'page' into field. Choices are: name, id, pages
    • 所以当我写评论时,我忘记了迁移。那解决了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 2013-10-09
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    相关资源
    最近更新 更多