我正在尝试使用 Django Rest Framework 上的装饰器操作过滤数据,如果我使用全局查询集(get_queryset() 函数),它可以完美运行,但我需要在单独的函数中使用它。
我正在使用 django-filter 来执行它。这是代码。
我的看法:
class ShippingAPI(viewsets.ModelViewSet):
serializer_class = ShippingSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('origin__department', 'destination__department', 'first_collection_date', 'last_collection_date', 'vehicle')
覆盖( Action )
@action(detail=False, methods=['GET'])
def filter_shippings(self, request, **kwargs):
queryset = Shipping.objects.filter(status=2, orderStatus=0)
serializer = SearchShippingSerializer(queryset, many=True) #Yes, I am using another serializer, but it is solved,I use diferent if it is necesary
return Response(serializer.data)
使用我的 url 'api/filter_shipping/(all filters here)'后,这仍然返回没有我请求的过滤器的所有数据。
谢谢你的帮助
最佳答案
您可以过滤 get_queryset
的结果以限制您的结果。
@action(detail=False, methods=['GET'])
def filter_shippings(self, request, **kwargs):
queryset = self.get_queryset().filter(status=2, orderStatus=0)
serializer = SearchShippingSerializer(queryset, many=True) #Yes, I am using another serializer, but it is solved,I use diferent if it is necesary
return Response(serializer.data)
编辑:
您可以根据需要创建自定义过滤器进行过滤。这是 django-filter 文档中的示例。
import django_filters
class ProductFilter(django_filters.FilterSet):
class Meta:
model = Product
fields = ['name', 'price', 'manufacturer']
def product_list(request):
filter = ProductFilter(request.GET, queryset=Product.objects.all())
return render(request, 'my_app/template.html', {'filter': filter})