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

urlconf:

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 に答える