如何在返回三类数据列表的GenericAPIView中对各模型name字段应用搜索过滤
实现方案
问题根因
你当前配置的SearchFilter过滤规则默认只会作用于GenericAPIView自带的get_queryset()返回的单一查询集,你手动编写了三类数据的查询逻辑,没有经过过滤器处理,所以搜索规则没有生效。
修复后完整代码
class SearchResult(generics.GenericAPIView): filter_backends = [DjangoFilterBackend, filters.SearchFilter] search_fields = ("name",) # 如果你不需要name字段的精确过滤,可删除下面这行 filter_fields = ("name",) def get(self, request): # 过滤餐厅数据 rests = self.filter_queryset(models.Restaurant.objects.all()) rests_serializer = serializers.RestaurantDisplaySerializer(rests, many=True) # 两种过滤逻辑二选一: # 逻辑1:餐品独立按name搜索,不关联餐厅搜索结果 meals = self.filter_queryset(models.Meal.objects.all()) # 逻辑2:仅返回搜索命中的餐厅下的餐品,同时匹配餐品name # meals = self.filter_queryset(models.Meal.objects.filter(res_id__in=rests.values_list("id", flat=True))) meals_serializer = serializers.MealSerializer(meals, many=True) # 优惠过滤逻辑和餐品保持一致即可 offers = self.filter_queryset(models.Offer.objects.all()) # 关联餐厅的写法 # offers = self.filter_queryset(models.Offer.objects.filter(res_id__in=rests.values_list("id", flat=True))) offers_serializer = serializers.OffersSerializer(offers, many=True) return Response({ "meals": meals_serializer.data, "restaurants": rests_serializer.data, "offers": offers_serializer.data })
说明
- 核心逻辑是对三类数据的查询集分别调用
self.filter_queryset()方法,应用你配置的搜索规则,即可实现三类数据的name字段统一搜索。 - 原代码漏写了
return关键字返回响应,已经修复。 - 你可以根据业务需要选择餐品、优惠的搜索逻辑是独立搜索,还是关联命中的餐厅搜索。
内容的提问来源于stack exchange,提问作者Shahed amer
相关产品推荐
相关产品推荐

