2014-03-26 3 views
1

내 프로젝트에서 모델을 저장할 때 프로젝트가 공동 모델로 다른 사용자를 추가 할 수있는 manytomanyfield, access_list가 포함 된 Access라는 다른 모델을 만듭니다. 그것은 작동 - 나는 새 프로젝트를 만들 때, 나는 그것으로 추가 사용자를 추가 할 수 있습니다,하지만 난 2 사용자를 추가하면 내가 계정으로 전환 할 경우, 더 이상 오류로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] 

Djangos get()항상 1 개체를 반환 할 예정이다. 객체가 0 개있는 경우 0보다 크면 DoesNotExist 예외가 발생하고 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()'에 대한 유일한 호출입니다. 잘못된 호출을 식별하여 필터로 가져 와서 수정하거나 매개 변수를 수정하십시오. –

+0

내 전체보기에서 하나의 다른 Access.objects.get 호출이 없습니다. 어디에서 볼 수 있는지 또는 다른 곳을 알 수 없습니다. –

관련 문제