7

我有一个基于函数的视图,如下所示:

def account_details(request, acc_id):
    account = get_object_or_404(Account, pk=acc_id, person__user=request.user)
    # ...

如果您无权访问该帐户或该帐户不存在,则会显示您帐户的成功详细信息,以及 404。

我试图使用基于类的视图(扩展 DetailView)来实现相同的功能,并想出了这个:

class AccountDetailView(DetailView):
    def get_object(self, queryset=None):
        obj = super(AccountDetailView, self).get_object(queryset)
        if obj.person.user != self.request.user:
            raise Http404()
        return obj

网址配置:

url(r'^account_details/(?P<pk>[0-9a-f]{24})$',
    login_required(AccountDetailView.as_view(model=Account)),
    name='account_details'),

这种态度有效,但引入了 2 个额外的查询,并且看起来是错误的。

是否有标准或更优雅的方式来实现相同的结果?

4

2 回答 2

18

无论如何,您需要传递什么论据get_queryset?这应该这样做:

def get_queryset(self):
    qs = super(MyView, self).get_queryset()
    return qs.filter(person__user=self.request.user)
于 2012-02-22T21:38:48.793 回答
4

如果您担心查询,可以使用select_related预取查询集中的用户配置文件:

 def get_queryset(self)
     return Account.objects.select_related("person", "person__user").all()

 def get_object(self, queryset=None):
     try:
         return queryset.get(pk=self.kwargs['acc_id'], person__user=self.request.user)
     except Account.DoesNotExist:
         raise Http404

我不得不说,有时很难让事物与基于类的视图相适应

于 2012-02-22T21:41:04.797 回答