对两个列表 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.
我认为 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.