Django类视图-MultipleObjectsReturned错误 [英] Django class view - MultipleObjectsReturned error

查看:51
本文介绍了Django类视图-MultipleObjectsReturned错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在django还是个新人,所以请多多包涵.我正在尝试建立一个有关书籍的网站.现在我遇到这样的错误

I'm still new at django so please bear with me. I'm trying to make a website about books. Now I'm having error like this

MultipleObjects返回/premium/1/get()返回了不止一本书-它返回了2个!

MultipleObjectsReturned at /premium/1/ get() returned more than one Book -- it returned 2!

我不知道在哪里查找错误.这是我的示例代码.

I don't know where to look for the error. Here is my example code.

class PageDetailView(LoginRequiredMixin, generic.View):

    def get(self, request, *args, **kwargs):
        book = get_object_or_404(Book)
        page = get_object_or_404(Page)
        user_membership = get_object_or_404(Customer, user=request.user)
        user_membership_type = user_membership.membership.membership_type
        user_allowed = book.allowedMembership.all()
        context = {'object': None}
        if user_allowed.filter(membership_type=user_membership_type).exists():
            context = {'object': page}
        return render(request, "catalog/page_detail.html", context)

跟踪:

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ exception.py"在内部34. response = get_response(request)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py"在_get_response中126. response = self.process_exception_by_middleware(e,request)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ core \ handlers \ base.py"在_get_response中124. response = wrapd_callback(request,* callback_args,** callback_kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ views \ generic \ base.py"鉴于68. return self.dispatch(request,* args,** kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py" in view 68. return self.dispatch(request, *args, **kwargs)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ contrib \ auth \ mixins.py"在派遣中52. return super().dispatch(request,* args,** kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\auth\mixins.py" in dispatch 52. return super().dispatch(request, *args, **kwargs)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ views \ generic \ base.py"在派遣中88. return handler(request,* args,** kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py" in dispatch 88. return handler(request, *args, **kwargs)

获取文件"C:\ Users \ admin \ thesis \ blackink_website \ catalog \ views.py"127. book = get_object_or_404(Book)

File "C:\Users\admin\thesis\blackink_website\catalog\views.py" in get 127. book = get_object_or_404(Book)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ shortcuts.py"在get_object_or_404中93. return queryset.get(* args,** kwargs)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\shortcuts.py" in get_object_or_404 93. return queryset.get(*args, **kwargs)

文件"C:\ Users \ admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ django \ db \ models \ query.py"在得到403.(self.model._meta.object_name,num)

File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\db\models\query.py" in get 403. (self.model._meta.object_name, num)

异常类型:MultipleObjects在/premium/1/返回值:get()返回了不止一本书-它返回了2个!

Exception Type: MultipleObjectsReturned at /premium/1/ Exception Value: get() returned more than one Book -- it returned 2!

如果信息不足,我将更新帖子.预先感谢.

I will update the post if the information is not enough. Thanks in advance.

更新

这是我的模型.py

class Book(models.Model):


title = models.CharField(max_length=200) #i deleted some info to make it shorter

allowedMembership = models.ManyToManyField(Membership, blank=True)


def get_absolute_url(self):
    return reverse('book-detail',  args=[str(self.id)])

def __str__(self):
    return self.title

@property
def pages(self):
    return self.page_set.all()



class Page(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE, null=True)
file = models.FileField(upload_to='book_content', validators=[pdf_file_extension], help_text="PDF File Only")
timestamp = models.DateTimeField(default=timezone.now)


def __str__(self):
    return self.book.title

def get_absolute_url(self):
    return reverse('page-detail',   args=[str(self.id)])

page_detail.html

page_detail.html

{% if user_membership and user_membership.user == request.user %}
        {% for content in book.pages %}
            <a href="{{ content.get_absolute_url }}" class="site-btn">Read</a>
        {% endfor %}
        {% else %}
        <button class="site-btn" disabled="disabled">VIP</button>
        {% endif %}

推荐答案

如果只需要一个对象,但返回多个对象,则查询会引发 MultipleObjectsReturned 异常. django.core.exceptions 中提供了此异常的基本版本.每个模型类都包含一个子类版本,该子类版本可用于标识已返回多个对象的特定对象类型.

The MultipleObjectsReturned exception is raised by a query if only one object is expected, but multiple objects are returned. A base version of this exception is provided in django.core.exceptions; each model class contains a subclassed version that can be used to identify the specific object type that has returned multiple objects.

我假设您正在使用最新的Django版本.从最底部的官方网站切换来查看基于您自己版本的正确文档.

I am assuming that you are using the recent Django version. See the proper documentation based on your own version by switching from very bottom the official site.

以下是最适合您的链接.

The following would be a best links for you.

https://docs.djangoproject.com/zh-CN/2.1/topics/http/views/#the-http404-exception

只要尝试这样,我还没有测试过,但是我相信它会像我之前测试过的那样工作.还要检查上述文档和内容.足以摆脱这个问题.

Just try like this, I have not tested but I am sure it will work as I had already tested before. Also check the above documentation & that is enough to get rid of this problem.

根据.

Configure your url based on https://docs.djangoproject.com/en/2.1/topics/class-based-... so that you could pass page_id and your url pattern should look something like path('pages/<int:page_id>', PageDetailView.as_view()) or re_path("^pages/(?<page_id>\d+)$", PageDetailView. as_view()).

在使用 path() re_path() url()时要小心,因为它们具有自己的样式+优势.

Be careful while using path(), re_path(), url() as they have their own style + advantage.

更新:

研究Book(父模型)和Page(子模型)之间的关系后,我从 path('pages/< int:page_id>/books/< int:book' path('pages/< page_id> )和页面ID足以提取相关书籍,因为两个模型之间存在 ForeignKey 关系.

Update:

After looking into the relationship between Book (parent model) and Page (child model), I changed the urlpattern from path('pages/<int:page_id>/books/<int:book' to path('pages/<page_id> and id of page is enough to fetch related book as there's a ForeignKey relationship between both the model.

由于您的视图是 PageDetailView ,因此最好仅传递页面ID以更好地进行设计(如其他人建议的那样(您也可以根据要求传递多个url参数,但这里不需要).

As your view is PageDetailView, it's good to pass only id of the page for better design as others suggest (you can pass several url parameters too based on requirements but here we don't need).

来自django的

from django.http import Http404

class PageDetailView(LoginRequiredMixin, generic.View):

    def get(self, request, *args, **kwargs):
        try:
            # page = get_object_or_404(Page)
            page_id = self.kwargs["page_id"]
            page = Page.objects.get(pk=page_id) 

            # book = get_object_or_404(Book)
            book_id = page.book.pk
            book = Book.objects.get(pk=book_id)

            # user_membership = get_object_or_404(Customer, user=request.user)
            user_membership = Customer.objects.get(user=request.user)

            user_membership_type = user_membership.membership.membership_type
            user_allowed = book.allowedMembership.all()
            context = {'object': None}
            if user_allowed.filter(membership_type=user_membership_type).exists():
                context = {'object': page}
            return render(request, "catalog/page_detail.html", context)
        except Book.DoesNotExist:
            raise Http404("Book with id {0} does not exist".format(book_id))
        except Page.DoesNotExist:
            raise Http404("Page with id {0} does not exist".format(page_id))
        except Customer.DoesNotExist:
            raise Http404("Cutomer does not exist")
        except Exception as e: 
            raise Exception(str(e)) 

这篇关于Django类视图-MultipleObjectsReturned错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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