【问题标题】:Django - Filtering in DetailViewDjango - 在DetailView中过滤
【发布时间】:2012-03-13 06:42:48
【问题描述】:

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

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 个额外的查询,看起来不对。

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

【问题讨论】:

  • 我的第一个想法是覆盖get_queryset(),但它不接受参数-无法检查帐户pk...
  • 顺便说一句,您可以通过 self.kwargs 在基于分类的视图中访问关键字 args

标签: python django django-views django-class-based-views


【解决方案1】:

无论如何,您需要将哪些参数传递给get_queryset?应该这样做:

def get_queryset(self):
    qs = super(MyView, self).get_queryset()
    return qs.filter(person__user=self.request.user)

【讨论】:

  • 出于某种原因,我认为它不会被 PK 正确过滤,谢谢。
【解决方案2】:

如果您担心查询,可以使用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

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

【讨论】:

  • 我也注意到了。在大多数情况下,我喜欢基于类的视图,但是还有一些简单的事情,比如将处理传递给另一个视图(基于函数的视图很容易),现在几乎是非常困难的。
猜你喜欢
  • 2020-07-29
  • 2012-12-15
  • 2015-09-15
  • 2019-09-02
  • 2020-06-01
  • 1970-01-01
  • 2021-03-17
  • 2018-02-26
  • 2015-03-20
相关资源
最近更新 更多