【问题标题】:ListView making queryset based on parameterListView 根据参数制作查询集
【发布时间】: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


【解决方案1】:

很难说哪个更好,但两种方法都有效。无论如何,最后我终于找到了一个更好的方法 - 是使用 django-filters,它是为基于标准进行过滤而完成的。

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多