2011-01-15 10 views
0

Ich habe eine FieldError.Django: FieldError kann das Schlüsselwort '___' nicht in ein Feld auflösen

Ich habe ein Modell:

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) 

Ich habe es mit dem Admin registriert in admin.py:

admin.site.register(Foo) 

Als ich/admin Runserver und gehen, ich sehe Foo in Die Liste. Wenn ich auf "Hinzufügen" klicke, funktioniert es gut und zeigt das Formular an, um ein neues Foo hinzuzufügen. Allerdings, wenn ich auf "speichern und eine andere hinzufügen" oder "Änderung" oder "Foos", bekomme ich ein FieldError

FieldError at /admin/appname/Foo/ 

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

Die Zurückverfolgungs ist:

Umwelt:

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 

Was könnte gehst hier vor? Ich habe ein wenig gesucht und ähnliche Fehler gefunden, aber sie scheinen etwas mit vielen-zu-vielen Feldern zu tun zu haben, von denen ich keine habe. Es gibt andere Modelle, die dieses als einen Fremdschlüssel bezeichnen, aber das scheint das Problem nicht zu verursachen.

Antwort

5

Da Sie __bar mit zwei Unterstrichen Python is performing name mangling (doc link) vorangestellt haben, um einen privaten Zugriff auf die Variable zu erzwingen.

privaten Variablen, natürlich, nicht in Python existieren, aber durch die Doppelstrich Konvention Sie Python gefragt haben __bar als _(classname)__bar, neu zu formatieren, weshalb Django Sie sagt, dass „Choices are: _Foo__bar ...“ .

Wenn Sie signalisieren möchten, dass bar außerhalb der Klasse nicht verwendet werden soll, empfehle ich die Single-Underscore-Notation (siehe auch obigen Link), die das Feldproblem lösen sollte Präfixe mit einem Unterstrich sind nicht umbenannt.

Verwandte Themen