我开始使用 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 Document 而不是 django 模型
class Poll(Document):

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

最佳答案

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

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() ,那个引发了你得到的异常)然后我想你会明白的。

关于python - 在 mongoengine 中使用 get_object_or_404() 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18038501/

10-14 13:42
查看更多