【问题标题】:How to pass queryset with exclude param in django-filter extension如何在 django-filter 扩展中使用排除参数传递查询集
【发布时间】:2016-09-14 05:17:30
【问题描述】:

我正在使用django-filterdjango-pure-pagination 扩展

class BuyFilterView(PaginationMixin, FilterView):
    filterset_class = ProductFilter
    template_name = "buy_filter.html"
    context_object_name = "goods"
    paginate_by = 50

    def get_context_data(self, **kwargs):
        context = super(BuyFilterView, self).get_context_data(**kwargs)
        context['cart'] = Cart.objects.get(user=self.request.user)
        return context


class ProductFilter(FilterSet):
    country = ChoiceFilter(choices=country_values)
    brand = ChoiceFilter(choices=brand_values)
    type = ChoiceFilter(choices=type_values)

    class Meta:
        model = Goods
        fields = {
            'country': ['exact'],
            'brand': ['exact'],
            'type': ['exact'],
        }

Goods 模型中的某些项目具有空白价格值。我想将它们从查询集中排除。我该怎么做?

【问题讨论】:

    标签: python django django-queryset django-filter


    【解决方案1】:

    您可以稍微修改您的 BuyFilterView 和 get_context_data() 以显式调用 ProductFilter 并使用 MultipleObjectMixin 和 TemplateView 的组合:

    class BuyFilterView(PaginationMixin, MultipleObjectMixin, TemplateView):
        template_name = "buy_filter.html"
        paginate_by = 50
    
        def get_context_data(self, **kwargs):
            context = super(BuyFilterView, self).get_context_data(**kwargs)
            context['cart'] = Cart.objects.get(user=self.request.user)
            context['goods'] = ProductFilter(request.GET,
                                             queryset=Goods.objects.exclude(price=''))
            return context
    

    另一个,也许更干净的选择是使用 ListView 并覆盖它的 get_queryset() 方法:

    class BuyFilterView(PaginationMixin, ListView):
        template_name = "buy_filter.html"
        paginate_by = 50
    
        def get_queryset(self):
            return ProductFilter(self.request.GET, queryset=Goods.objects.exclude(price=''))
    
        def get_context_data(self, **kwargs):
            context = super(BuyFilterView, self).get_context_data(**kwargs)
            context['cart'] = Cart.objects.get(user=self.request.user)
            return context
    

    【讨论】:

    • 并非如此,因为您在 get_context_data() 中明确定义了上下文数据。您可以改用 TemplateView。
    • 看起来 TemplateView 没有实现用于分页的 MultipleObjectMixin。你碰巧知道如何用分页来制作它吗?
    • 好的,您可以添加 MultipleObjectMixin 或使用 ListView 代替 TemplateView 并覆盖其 get_queryset() 方法。请参阅我的更新答案。
    • 终于让它和FilterView一起工作了。我需要它在过滤器对象中内置表单。出于某种原因,必须设置 FilterView 的 model 参数,即使它是在我的过滤器的 Meta 类中声明的。感谢您的帮助。
    猜你喜欢
    • 2014-10-25
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2021-06-02
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多