2014-12-03 2 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

+0

@alecxe см. Обновленное сообщение. – user1552400

+0

Почему у вас нет toolid в качестве внешнего ключа к объекту инструмента? Проблема заключается в том, что поскольку toolid не должен быть уникальным для 'Request', он не работает. Возможно, вы захотите использовать 'filter' вместо' get_object_or_404' – karthikr

ответ

0

Согласно официальной документации Джанго - 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) 

есть проблема, как вы на самом деле имеют 2 Request объектов с одинаковым значением идентификатора инструмента.

Смежные вопросы