2017-10-20 48 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,根據標準進行篩選。