代码之家  ›  专栏  ›  技术社区  ›  Dmitrii

基于参数的ListView生成查询集

  •  2
  • Dmitrii  · 技术社区  · 8 年前

    我有一个列表视图,它是一个项目列表,比如说,产品。我想通过从模板发送一个参数来有条件地更改这个查询集。假设我想过滤供应商id或其他类似日期的内容。我应该为每种情况创建一个新视图,还是根据条件仅在查询集中扩展基本ListView,或者我应该仅使用一个ListView并根据传递的参数处理每种情况,所以

    class ProductListView(ListView):
    ...
    def get_queryset(self):
            return Supplier.objects.all()
    
    class ProductBySupplierListView(ProductListView):
    
    def get_queryset(self):
            return Supplier.objects.filter(supplier=self.kwargs['sup'])
    

    或

    class ProductListView(ListView):
    ...
    def get_queryset(self):
        if self.kwargs['sup']:
            return Supplier.objects.filter(supplier=sup)
        else:
            return Supplier.objects.all().annotate(prd_cnt=Count('product'))
    

    或者可能有一些更好的模式来处理多条件排序问题。

    我知道我可以做任何事情 Filtering Objects in Class based view Django using Query parameters? 但这是一个好的设计还是我更喜欢其他东西,比如前面提到的扩展和重写queryset方法。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Dmitrii    8 年前

    很难说哪一种更好,但这两种方法都有效。无论如何,最后我终于找到了一个更好的方法——使用django过滤器,这是基于标准的过滤。