2017-10-20 46 views
0

制作查询集我有一个ListView,它正在制作项目列表,比如产品。我想通过从模板发送参数来有条件地更改此查询集。假设我想过滤supplier_id或类似日期的其他内容。我应该创建一个新的查看每个情况或扩展基本的ListView视病情鲍勃迪伦只有我查询集或者根据传递的参数,我应该只使用一个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方法。

+0

[基于类的视图Django使用查询参数过滤对象的可能重复?](https://stackoverflow.com/questions/31960428/filtering-objects-in-class-based-view-django-using-query-参数) – YPCrumble

+0

是的,但我想知道这是正确的设计standpoing?现在我试图扩展和重写queryset方法每次我需要它,并有每个排序条件单独的URL映射。 – Dmitrii

+0

你是什么意思的一个“单独的URL映射”?从设计角度来看,[接受的答案](https://stackoverflow.com/a/31960938/2532070)在这里是正确的。因此,您的第二种过滤方式是正确的,除非还有其他未提及的内容,这意味着供应商过滤需要自己的子类别视图。 – YPCrumble

回答

0

很难说哪一个更好,但两种方法都有效。无论如何,最后我终于找到了一个更好的方法 - 就是使用django-filters,根据标准进行筛选。