2014-12-03 25 views
0

我該如何解決這個錯誤?仍然在學習Django,我試圖找出這段代碼有什麼問題。MultipleObjectsReturned at/return_tool/2/

它強調了這個錯誤: requestTool = get_object_or_404(Request, toolId=tool.id) 錯誤:

MultipleObjectsReturned at /return_tool/2/ 
get() returned more than one Request -- it returned 2! 
Request Method: GET 
Request URL: http://127.0.0.1:8000/return_tool/2/ 
Django Version: 1.6.7 
Exception Type: MultipleObjectsReturned 
Exception Value:  
get() returned more than one Request -- it returned 2! 
Exception Location: C:\Python34\lib\site-packages\django\db\models\query.py in get, line 313 
Python Executable: C:\Python34\python.EXE 

view.py

@login_required 
def return_tool(request, tool_id): 
    tool = get_object_or_404(Tool, pk=tool_id) 
    requestTool = get_object_or_404(Request, toolId=tool.id) 
    if(request.user.id == requestTool.borrowerId): 
     if (request.method == 'POST'): 
      form = RequestForm(request.POST) 
      if form.is_valid(): 
       requestTool.returnType = 'Return' 
       requestTool.returnStatus = 'Pending' 
       requestTool.view_owner = False 
       requestTool.save() 
       return HttpResponseRedirect('/thanks_for_requesting/' + str(requestTool.id)) 
      else: 
       tool = Tool.objects.get(pk=requestTool.toolId) 
       return render(request, 'return_tool.html', {'form': form, 'tool': tool}) 
     else: 
      form = RequestForm() 
      tool = Tool.objects.get(pk=requestTool.toolId) 
      return render(request, 'return_tool.html', {'form': form, 'tool': tool}) 
    else: 
     return HttpResponseForbidden() 

這裏是models.py

class Tool(models.Model): 
    """ 
    Display the tools name, owner, description, category, and shed. 
    """ 
    name = models.CharField(max_length=30) 
    owner = models.IntegerField() 
    description = models.CharField(max_length=100) 
    category = models.CharField(max_length=50) 
    registered = models.DateField(auto_now_add=True) 
    shed = models.IntegerField(blank = True, null = True) 
    sharezone = models.PositiveIntegerField(max_length=5) 
    managerName = models.CharField(blank=True, max_length=15) 
    borrower = models.IntegerField(blank = True, null = True) 
    sharezone = models.PositiveIntegerField(max_length=5) 
    dueDate = models.DateField(blank = True, null = True) 
    brand = models.CharField(max_length=50) 
    status = models.CharField(max_length=25) 
    borrowName = models.CharField(max_length=15) 

    def __str__(self): 
     return self.name 

    def get_brand(self): 
     return self.brand 

    def get_name(self): 
     return self.name #return tool name 

    def get_category(self): 
     return self.category #return category 

    def get_location(self): 
     return self.location #return location 

    def get_shed(self): 
     return ToolShed.objects.get(id = self.shed) 

    def get_owner(self): 
     return userAcc.objects.get(id = self.owner) 

    def get_description(self): 
     return self.description 

    def get_sharezone(self): 
     return self.sharezone 

    def get_borrower(self): 
     return userAcc.objects.get(id = self.borrowerId) 

    def get_status(self): 
     return self.status 

    def get_dueDate(self): 
     return self.dueDate 

    def get_borrowName(self): 
     return self.borrowName 

class Request(models.Model): 
    REQUEST_TYPE = [('Borrow', 'Borrow'), ('Return', 'Return'),] 
    REQUEST_STATUS=[('Pending','Pending'),('Accepted','Accepted'),('Denied','Denied'),] 
    returnType = models.CharField(max_length=1, choices=REQUEST_TYPE, default ='Borrow') 
    returnStatus = models.CharField(max_length=1, choices=REQUEST_STATUS, default ='Pending') 
    toolId = models.IntegerField() 
    ownerId = models.IntegerField() 
    borrowerId = models.IntegerField() 
    message = models.TextField(blank=False) 
    dueDate = models.DateField() 
    viewed_borrower = models.BooleanField(default=True) 
    viewed_owner = models.BooleanField(default=False) 
    borrowName = models.CharField(max_length=15) 

    def __str__(self): 
     if self.returnType == 'Borrow': 
      if self.returnStatus == 'Accepted': 
       return 'Accepted Borrow Request' 
      elif self.returnStatus == 'Denied': 
       return 'Denied Borrow Request' 
      else: 
       return 'Pending Borrow Request' 
     elif self.returnType == 'Return': 
      if self.returnStatus == 'Accepted': 
       return 'Accepted Return Request' 
      else: 
       return 'Pending Return Request' 

任何幫助將是巨大的。謝謝。

+0

爲了完整起見,顯示'Request'和'Tool'模型定義。謝謝。 – alecxe 2014-12-03 15:26:44

+0

@alecxe看到更新的帖子。 – user1552400 2014-12-03 15:29:15

+0

你怎麼沒有toolid作爲工具對象的外鍵?問題是,由於toolid不必是「Request」唯一的,所以它失敗了。您可能想使用'filter'而不是'get_object_or_404' – karthikr 2014-12-03 15:32:56

回答

0

根據官方的Django文檔 - https://docs.djangoproject.com/en/dev/topics/http/shortcuts/

爲get_object_or_404有一張紙條:

Note: As with get(), a MultipleObjectsReturned exception will be raised if more than one object is found.

看來,在你的代碼:

requestTool = get_object_or_404(Request, toolId=tool.id) 

有一個問題,你實際上具有相同toolID值的2個Request對象。

相關問題