【问题标题】:Django: FieldError cannot resolve keyword '___' into a fieldDjango:FieldError 无法将关键字“___”解析为字段
【发布时间】:2011-06-09 19:10:58
【问题描述】:

我有一个FieldError

我有一个模型:

class Foo(models.Model):

    __bar = models.TextField(default=lambda: cPickle.dumps(set()), primary_key=True)

    def get_bar(self):
        return cPickle.loads(str(self.__bar))

    def set_bar(self, values):
        self.__bar = cPickle.dumps(values)

    bar = property(get_bar, set_bar)

我已经在 admin.py 中向管理员注册了它:

admin.site.register(Foo)

当我运行服务器并转到 /admin 时,我在列表中看到 Foo。如果我单击“添加”,它可以正常工作,显示添加新 Foo 的表单。但是,如果我点击“保存并添加另一个”或“更改”或“Foos”,我会得到一个FieldError

FieldError at /admin/appname/Foo/

Cannot resolve keyword '_Foo' into field. Choices are: _Foo__bar, appname

回溯是:

环境:

Request Method: GET
Request URL: http://127.0.0.1:8000/admin/appname/foo/
Django Version: 1.2.4
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.admin',
 'pagination',
 'apps.appname']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'pagination.middleware.PaginationMiddleware')


Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/options.py" in wrapper
  265.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
  78.         response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in inner
  190.             return view(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapper
  21.             return decorator(bound_func)(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in bound_func
  17.                 return func(self, *args2, **kwargs2)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/options.py" in changelist_view
  1097.             'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in __len__
  80.                 self._result_cache = list(self.iterator())
File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in iterator
  271.         for row in compiler.results_iter():
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in results_iter
  677.         for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in execute_sql
  722.             sql, params = self.as_sql()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in as_sql
  57.         ordering, ordering_group_by = self.get_ordering()
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in get_ordering
  346.                         self.query.model._meta, default_order=asc):
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py" in find_ordering_name
  375.                 opts, alias, False)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py" in setup_joins
  1215.                             "Choices are: %s" % (name, ", ".join(names)))

Exception Type: FieldError at /admin/appname/foo/
Exception Value: Cannot resolve keyword '_Foo' into field. Choices are: _Foo__bar, appname

这里会发生什么?我做了一些搜索,发现了类似的错误,但它们似乎与多对多字段有关,而我没有。有其他模型将此作为外键引用,但这似乎不太可能导致问题。

【问题讨论】:

    标签: python database django django-admin


    【解决方案1】:

    因为您在 __bar 前面加上了两个下划线 Python is performing name mangling (doc link),以尝试强制对变量进行私有访问。

    当然,私有变量在 Python 中不存在,但是通过使用双下划线约定,您要求 Python 将 __bar 重新格式化为 _(classname)__bar,这就是 Django 告诉您“@987654325 @..."。

    如果您想表明 bar 不应在课堂外使用,我建议您使用单下划线表示法(也在上面的链接中讨论过),它应该可以解决您遇到的字段问题因为单下划线前缀不是名称错位。

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2018-11-23
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2013-10-09
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多