我有一个基于功能的视图,如下所示:
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
urlconf:
url(r'^account_details/(?P<pk>[0-9a-f]{24})$',
login_required(AccountDetailView.as_view(model=Account)),
name='account_details'),
这种态度有效,但引入了2个额外的查询,看起来不对。
是否有标准或更优雅的方法来实现相同的结果?
答案 0 :(得分:15)
你需要传递给get_queryset
的论据是什么?这应该这样做:
def get_queryset(self):
qs = super(MyView, self).get_queryset()
return qs.filter(person__user=self.request.user)
答案 1 :(得分:3)
如果您对查询感到担心,可以使用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
我不得不说,有时很难让事情适应基于类的观点