2014-03-26 60 views
1

在我的項目,我有一個模型,項目,即在保存時創建另一個模型,Access,它包含了manytomanyfield,一個access_list,用戶可以將其他用戶添加到他們的合作者項目。它的工作原理 - 當我創建一個新的項目,我可以添加其他用戶到它,但如果我添加第二個用戶,這將不再擔任該網頁有錯誤,添加ManytoManyField打破Django的

Exception Value: get() returned more than one Access -- it returned 2!" 

如果我切換到一個帳戶我已添加到該項目中,然後使用該帳戶添加其他用戶,他們添加的很好,並且不會破壞頁面。

當分頁符,它也創造了我的項目頁面上的項目的其他實例,即使只有一個數據庫項目的實例。

我的代碼:

Models.py:

class Project(models.Model): 
    created_by = models.ForeignKey(User) 

    super(Project, self).save() 
    Access.objects.get_or_create(project=self) 

class Access(models.Model): 
    project = models.ForeignKey(Project) 
    access_list = models.ManyToManyField(User) 
    pubdate = models.DateTimeField(default=timezone.now) 

Views.py:

@login_required 
def access(request, project_id=1): 
thisuser = request.user 
if Access.objects.filter(Q(access_list=thisuser) | Q(project__created_by=thisuser), project__id=project_id).exists(): 
     accesspermission = Access.objects.filter(Q(access_list=thisuser) | Q(project__created_by=thisuser), project__id=project_id).order_by('-project__project_pubdate')[0] 
    else: 
     accesspermission = None 
    if Entry.objects.filter(project_id=project_id).exists(): 
     anyentries = Entry.objects.filter(project_id=project_id, entry_unique=1).order_by('-entry_pubdate')[0] 
    else: 
     anyentries = None 
    if Entry.objects.filter(project_id=project_id, entry_unique=1).exists(): 
     firstentry = Entry.objects.filter(project_id=project_id, entry_unique=1).order_by('-entry_pubdate')[0] 
    else: 
     firstentry = None 
    if Entry.objects.filter(project_id=project_id).exists(): 
     lastentry = Entry.objects.filter(project_id=project_id).order_by('-entry_pubdate')[0] 
     lastentrynumber = lastentry.entry_unique 
    else: 
     lastentrynumber = None 
if request.method == "POST":  
    form = AddAccessForm(request.POST) 
    if form.is_valid(): 
     p = form.save(commit=False) 

     adduserfromform = p.accessupdate 
     if User.objects.filter(username=adduserfromform).exists(): 
      usertoadd = User.objects.get(username=adduserfromform) 
      projecttoadd = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0] 
      projecttoadd.access_list.add(usertoadd) 
     else: 
      usertoadd = None 

     removeuserfromform = p.accessremove 
     if User.objects.filter(username=removeuserfromform).exists(): 
      usertoremove = User.objects.get(username=removeuserfromform) 
      projecttoremove = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0] 
      projecttoremove.access_list.remove(usertoremove) 
     else: 
      usertoremove = None 

     form.save() 

     return HttpResponseRedirect('/projects/get/%s/access' % project_id) 

回溯:

Traceback (most recent call last): 
    File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/webapps/filmeditdb/filmeditdb/docproject/views.py", line 284, in access 
    def access(request, project_id=1): 
    File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get 
    return self.get_queryset().get(*args, **kwargs) 
    File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get 
    (self.model._meta.object_name, num)) 
MultipleObjectsReturned: get() returned more than one Access -- it returned 2! 
2014-03-25 22:48:26 [17264] [INFO] Handling signal: winch 
2014-03-25 22:48:26 [17264] [INFO] SIGWINCH ignored. Not daemonized 

回答

0

添加完整回溯一般特別建議,但是來自錯誤s hown問題是最有可能在這條線:

projecttoremove = Access.objects.get(project__id=project_id).order_by('-project__project_pubdate')[0] 

Django的get()總是預計返回只有 1對象。如果有0個對象,則拋出異常,如果超過0則拋出MultipleObjectsReturned異常。

更改了該行早前線在這裏匹配:

projecttoadd = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0] 

如果做不到這一點,找出錯誤的調用。你得到的例外很清楚。 在代碼中的某些時候,你在呼喚Access.objects.get()一些參數,它是尋找2個的對象,而不是1.請修正參數,或MOER可能切換爲使用filter()

+0

我換了一條線,但似乎沒有幫助。我按照你的要求添加了回溯。 –

+0

@JasonB我已經添加了一個說明,但該行是在示例中對'Access.objects.get()'的唯一調用。識別不正確的調用以獲取並更正過濾器或更正參數。 – 2014-03-26 02:55:41

+0

我在整個視圖中沒有單獨的其他Access.objects.get調用,我不確定還有其他地方或我可以查看的其他東西。 –