You need to enable JavaScript to run this app. 如何在返回三类数据列表的GenericAPIView中对各模型name字段应用搜索过滤
优惠活动
大模型
产品
解决方案
定价
更多

如何在返回三类数据列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 08:36:03