使用预定义choices跨Django模型多字段筛选无返回结果如何解决
问题核心原因
你的代码存在4个关键错误导致过滤无返回:
- 自定义的
store_checks方法没有绑定到store过滤字段,django-filter默认只会按字段名匹配过滤,不会自动调用你写的自定义方法 - 自定义过滤方法的第三个参数是用户提交的选中值,你命名为
store_choices导致误拿全局定义的choices元组做查询值,自然匹配不到任何数据 MultipleChoiceFilter传入的选中值是列表类型,不能直接用于icontains查询,需要遍历选中的每个值构造查询条件- 自定义方法内直接调用
Product.objects.filter会覆盖之前已经生效的品牌、价格等过滤条件,必须基于传入的queryset做过滤
修正后的代码
store_choices = ( ('harveynichols', 'Harvey Nichols'), ('houseoffraser', 'House of Fraser'), ('selfridges', 'Selfridges'), ('lookfantastic', 'LOOKFANTASTIC'), ('superdrug', 'Superdrug'), ('boots', 'Boots'), ('allbeauty', 'allbeauty'), ('asos', 'asos'), ) class ProductFilter(django_filters.FilterSet): # 新增method参数绑定自定义过滤方法 store = django_filters.MultipleChoiceFilter(choices=store_choices, method='store_checks') brand = django_filters.MultipleChoiceFilter(choices=brand_choices) price = django_filters.RangeFilter() class Meta: model = Product fields = ['store', 'brand', 'price'] # 第三个参数重命名为selected_stores,明确是用户选中的值 def store_checks(self, queryset, name, selected_stores): # 初始化空Q对象 query = Q() # 遍历所有选中的店铺值构造或查询 for store_val in selected_stores: query |= ( Q(store__icontains=store_val) | Q(storehn__icontains=store_val) | Q(storehof__icontains=store_val) | Q(storesf__icontains=store_val) | Q(storelf__icontains=store_val) | Q(storesd__icontains=store_val) | Q(storeboots__icontains=store_val) | Q(storeab__icontains=store_val) | Q(storea__icontains=store_val) ) # 基于传入的queryset过滤,保留之前的条件 return queryset.filter(query)
逻辑说明
当用户选中多个店铺时,代码会逐个匹配每个店铺值,只要商品的任意一个store相关字段包含该值就会被命中,同时会保留品牌、价格区间的过滤条件。
内容的提问来源于stack exchange,提问作者Judoo123
相关产品推荐
相关产品推荐

