2015-09-16 178 views
0

我有複雜的模型:Django的related_name不起作用

class Person(models.Model): 
    names = models.ManyToManyField('Name') 
    wives = models.ManyToManyField('Person',related_name='husbands',null = True, blank = True) 

及形狀:

class PersonForm(ModelForm): 
    names_list = forms.ModelMultipleChoiceField(queryset=Person.objects.filter(names_set__id=2), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 
    wives_list = forms.ModelMultipleChoiceField(queryset=Person.objects.filter(husbands__id=2), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 

    class Meta: 
     model = Person 
     fields = ('names','wives') 
     widgets = { 
     'names' : forms.HiddenInput(), 
     'wives': forms.HiddenInput(), 
     } 

不幸的是 - 不知什麼原因 - 妻子的工作,names_set - 沒有。我試圖添加related_name:

names = models.ManyToManyField('Name', related_name='name_owners') 

But not. The Error is: 
FieldError at /mysite/edit/2/ 
Cannot resolve keyword 'name_owners' into field. Choices are: husbands, id, names, wives 

我重構的代碼(更早的名稱只是一個文本)我忘了改變?

Trackback: 
Environment: 


Request Method: GET 
Request URL: 

Django Version: 1.7.7 
Python Version: 2.7.9 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.admindocs', 
'django.contrib.staticfiles', 

) 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware') 


Traceback: 
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    98.     resolver_match = resolver.resolve(request.path_info) 
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve 
    345.      sub_match = pattern.resolve(new_path) 
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve 
    345.      sub_match = pattern.resolve(new_path) 
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve 
    224.    return ResolverMatch(self.callback, args, kwargs, self.name) 
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in callback 
    231.   self._callback = get_callable(self._callback_str) 
File "/usr/lib/python2.7/dist-packages/django/utils/lru_cache.py" in wrapper 
    101.      result = user_function(*args, **kwds) 
File "/usr/lib/python2.7/dist-packages/django/core/urlresolvers.py" in get_callable 
    97.    mod = import_module(mod_name) 
File "/usr/lib/python2.7/importlib/__init__.py" in import_module 
    37.  __import__(name) 
File "/home/excursor/frontoffice/views.py" in <module> 
    35. class DiggerForm(ModelForm): 
File "/home/excursor/frontoffice/views.py" in DiggerForm 
    139. names_list = forms.ModelMultipleChoiceField(,queryset=Person.objects.filter(names_set__id=2), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 
File "/usr/lib/python2.7/dist-packages/django/db/models/manager.py" in manager_method 
    92.     return getattr(self.get_queryset(), name)(*args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/django/db/models/query.py" in filter 
    691.   return self._filter_or_exclude(False, *args, **kwargs) 
File "/usr/lib/python2.7/dist-packages/django/db/models/query.py" in _filter_or_exclude 
    709.    clone.query.add_q(Q(*args, **kwargs)) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in add_q 
    1331.   clause, require_inner = self._add_q(where_part, self.used_aliases) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in _add_q 
    1358.      current_negated=current_negated, connector=connector) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in build_filter 
    1182.   lookups, parts, reffed_aggregate = self.solve_lookup_type(arg) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in solve_lookup_type 
    1120.   _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in names_to_path 
    1427.    self.raise_field_error(opts, name) 
File "/usr/lib/python2.7/dist-packages/django/db/models/sql/query.py" in raise_field_error 
    1433.       "Choices are: %s" % (name, ", ".join(available))) 

Exception Type: FieldError at 
Exception Value: Cannot resolve keyword 'names_set' into field. Choices are: husbands, id, names, wives 
+0

你能發佈完整的錯誤文本? – Ivan

+0

看起來你沒有在這裏做一個反向關係 – karthikr

+1

請確保你的代碼是一貫到處。上面我可以看到'name_set','name_owners'和'names'。看完整的回溯,它會告訴你問題出在哪裏。 – Alasdair

回答

1

您誤解了related_name的工作原理。

Person.objects.filter()將始終返回人員,而不是姓名。

如果你想名稱的查詢集,然後做

Name.objects.filter(person=2) 

,將返回鏈接到人的名字與編號2(你不需要__id因爲id是主鍵。

你的代碼是爲丈夫/妻子工作的原因是該領域鏈接到相同的模型。

+0

現在我明白了......這是一個巧合......我必須編輯你的帖子,因爲經驗主義表明這是一個很好的解決方案 –