如何处理MultiObjects返回的错误 [英] How to deal with a MultiObjectsReturned Error

查看:53
本文介绍了如何处理MultiObjects返回的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在尝试加载页面时遇到此错误。 get()返回多个项目-返回2!查找参数为{}

I have come across this error as i try to load a page. get() returned more than one Item -- it returned 2! Lookup parameters were {}

以下是呈现页面的视图:

here is the view that renders the page:

def get_category(request):
    categories = Category.objects.all().prefetch_related('item')
    # need to evaluate the HTTP method
    if request.method == 'POST':
        # add to order..create the bound form
        postdata = request.POST.copy()
        form = forms.PartialOrderItemForm(request.POST,postdata)
        # check validation of posted data
        if form.is_valid():

            order.add_to_order(request)
            # if test cookie worked, get rid of it
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            url =urlresolvers.reverse('order_index')
            # redirect to order page
            return HttpResponseRedirect(url)
    else:
        # it's a GET, create the unbound from. Note request as a Kwarg
        form = forms.PartialOrderItemForm(request.GET)
    # set the test cookie on our first GET request
    request.session.set_test_cookie()
    context={
        'categories':categories,
        'form':form,
#       'menu':menu,

    }
    return render_to_response('category.html',context,context_instance=RequestContext(request))

此视图在某些情况下调用以下函数 is_valid 之后的点,

This view calls the following function at some point after is_valid,

def add_to_order(request):  
    postdata = request.POST.copy()
    #get quantity added, return 0 if empty
    quantity = postdata.get('quantity',0)
    # fetch the item or return  missing page error_message
    i = get_object_or_404(Item,)
    # get items in order
    order_items = get_order_items(request)
    item_in_orders = False
    # check to see if item is already in order
    for order_item in order_items:
        if order_item.item.id == i.id:
            #update the quantity if found
            order_item.augment_quantity(quantity)
            item_in_orders = True
    if not item_in_orders:
        # creat and save a new order item
        oi = OrderItem()
        oi.order_id = _order_id(request)
        oi.quantity = quantity
        oi.item = i
        oi.save()

这是Traceback

and here is the Traceback

Traceback:
File "/home/mats-invasion/projects/f4l/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/mats-invasion/projects/f4l/f4l/live/views.py" in get_category
  26.           order.add_to_order(request)
File "/home/mats-invasion/projects/f4l/f4l/cart/order.py" in add_to_order
  42.   i = get_object_or_404(Item,)

File "/home/mats-invasion/projects/f4l/env/local/lib/python2.7/site-packages/django/shortcuts/__init__.py" in get_object_or_404
  113.         return queryset.get(*args, **kwargs)
File "/home/mats-invasion/projects/f4l/env/local/lib/python2.7/site-packages/django/db/models/query.py" in get
  368.                 % (self.model._meta.object_name, num, kwargs))

Exception Type: MultipleObjectsReturned at /menu/
Exception Value: get() returned more than one Item -- it returned 2! Lookup parameters were {}

谢谢。

推荐答案

在您的行中 i = get_object_or_404(Item,)尝试获取该项目,但您未指定任何过滤器查询为此,因此它将尝试 Item.objects.get()它将返回所有对象(类似于 Item.objects.all())。 .get() get_object_or_404() 在存在多个对象时会引发 MultipleObjectsReturned 异常

In your line i = get_object_or_404(Item,) tries to get the item, but you haven't specified any filter query for it, so it will try Item.objects.get() which will return all objects (similar to Item.objects.all()). .get() and get_object_or_404() raises MultipleObjectsReturned exception when there are multiple objects for the given query.

因此您需要将行更新为以下内容:

So you need to update your line to something like:

i = get_object_or_404(Item, id=someid)

这篇关于如何处理MultiObjects返回的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆