3

我开始使用 Mongodb 学习 Django,按照 djangoproject 教程创建一个投票应用程序。我在引发 404 错误时遇到问题。如果我这样做:

def detail(request, poll_id):
 try:
    poll = Poll.objects.get(pk=poll_id)
 except Poll.DoesNotExist:
    raise Http404
 return render(request, 'polls/detail.html', {'poll': poll})

它有效,但如果我尝试使用 django 快捷方式:

def detail(request, poll_id):
  poll = get_object_or_404(Poll, pk=poll_id)
  return render(request, 'polls/detail.html', {'poll': poll})

我收到这个错误

Object is of type 'Poll', but must be a Django Model, Manager, or QuerySet

我认为发生此错误是因为在 models.py 中我将 Poll 模型定义为 mongoengine 文档而不是 django 模型

class Poll(Document):

我应该怎么做才能使 get_object_or_404() 方法正常工作?

4

1 回答 1

4

是时候推出自己的捷径了吗?

def get_obj_or_404(klass, *args, **kwargs):
    try:
        return klass.objects.get(*args, **kwargs)
    except klass.DoesNotExist:
        raise Http404

def detail(request, poll_id):
    poll = get_obj_or_404(Poll, pk=poll_id)
    return render(request, 'polls/detail.html', {'poll': poll})

我还没有测试它,但这是基本的想法。

我不认为你做错了什么,只是 Django 快捷方式不支持Document该类。检查Django源代码,特别是函数get_object_or_404()(它使用函数_get_queryset(),引发异常的那个)然后我想你会明白的。

于 2013-08-04T00:29:50.933 回答