我该如何解决此错误?还在学习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'
任何帮助都会很棒。感谢。
答案 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值。