简体   繁体   中英

MultipleObjectsReturned at /return_tool/2/

How would I fix this error? Still learning Django, I am trying to figure out what is wrong with this code.

it highlights this error: requestTool = get_object_or_404(Request, toolId=tool.id) error:

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()

here is the 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'

any help would be great. Thanks.

According to official django documentation - https://docs.djangoproject.com/en/dev/topics/http/shortcuts/

for get_object_or_404 there is a note:

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

It seems that in your code:

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

there is an issue as you actually have 2 Request objects with the same toolID value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM