【发布时间】:2018-04-01 18:13:25
【问题描述】:
我有一个 ListView,它正在制作一个项目列表,比如产品。我想通过从模板发送参数来有条件地更改此查询集。假设我想过滤供应商 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 方法,并为每个排序条件设置单独的 url 映射。
-
“单独的 url 映射”是什么意思?从设计的角度来看,这里的accepted answer 是正确的。因此,您的第二种过滤方式是正确的,除非有其他未提及的内容意味着供应商过滤需要其自己的子类视图。
-
通过“单独的 url 映射”我的意思是我在 urls.py 中有不同的 ulr 路径和与之不同的关联 ListView。我的问题是哪个更好 - 有一个 ListView 并选择在单个查询集方法中排序,或者为每个排序条件设置单独的 ListView。而且我不能肯定地说在传递的参数上选择排序更好。
-
很可能使用一个 ListView 更好,但它主要是基于意见和/或特定于您的特定实现。
标签: django