MultipleObjectsReturned at / return_tool / 2 /

时间:2014-12-03 15:22:25

标签: django

我该如何解决此错误?还在学习Django,我试图弄清楚这段代码有什么问题。

它突出显示了此错误: 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'

任何帮助都会很棒。感谢。

1 个答案:

答案 0 :(得分:0)

根据官方django文档 - https://docs.djangoproject.com/en/dev/topics/http/shortcuts/

对于get_object_or_404,有一个注释:

  

注意:与get()一样,MultipleObjectsReturned异常将是   如果找到多个对象,则会引发。

似乎在您的代码中:

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

存在一个问题,因为实际上有2个Request个对象具有相同的toolID值。