Django - 在DetailView中过滤

ypr*_*rez 4 python django django-views django-class-based-views

我有一个基于函数的视图,看起来像这样:

def account_details(request, acc_id):
    account = get_object_or_404(Account, pk=acc_id, person__user=request.user)
    # ...
Run Code Online (Sandbox Code Playgroud)

其中显示了您的帐户成功的详细信息,如果您没有访问该帐户的权限或它不存在,则显示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
Run Code Online (Sandbox Code Playgroud)

urlconf:

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

这种态度有效,但引入了2个额外的查询,看起来不对.

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

Chr*_*att 15

get_queryset无论如何你需要传递什么参数?这应该这样做:

def get_queryset(self):
    qs = super(MyView, self).get_queryset()
    return qs.filter(person__user=self.request.user)
Run Code Online (Sandbox Code Playgroud)