对两个列表 GenericAPIView 应用搜索过滤器

apply search filter for two lists GenericAPIView

我认为 return 3 个列表(餐厅餐点) 我想在所有名称字段上应用搜索过滤器我该如何实现

class SearchResult(generics.GenericAPIView):
    filter_backends = [DjangoFilterBackend,filters.SearchFilter]
    filter_fields = ("name",)
    search_fields = ("name",)

    def get(self,request):
       rests= models.Restaurant.objects.filter()
       rests_serializer = serializers.RestaurantDisplaySerializer(rests, many=True)
       meals= models.Meal.objects.filter(res_id__in=list(rests))
       meals_serializer = serializers.MealSerializer(meals,many=True)
       offers = models.Offer.objects.filter(res_id__in= list(rests))
       offers_serializer = serializers.OffersSerializer(offers,many=True)
      Response({"meals":meals_serializer.data,"restaurants":rests_serializer.data,"offers":offers_serializer.data},
        )

相反,我会建议您像这样构建一个嵌套序列化程序 -

class RestaurantDisplaySerializer(serializers.ModelSerializer):

    meals = MealSerializer()
    offers = OffersSerializer()
    
    class Meta:
        model = models.Restaurant
        fields = '__all__'

在您看来,使用 filterset_class -

而不是 filter_fields
class SearchResult(generics.GenericAPIView):

    filter_backends = [DjangoFilterBackend,filters.SearchFilter]

    filterset_class = CustomFilterClass

    def get(self,request):

       return models.Restaurant.objects.filter()

您可以创建自己的自定义过滤器,使其适用于嵌套对象。请参阅 DRF 文档 here.