2016-06-08 326 views
0

我的过滤器不工作每当我访问http://localhost:8080/payables/invoices/?status=NOT_PAID它只是返回所有的发票。我没有运行时错误,我输入的参数似乎被忽略。我真的不明白,除此之外,它运作良好。Django过滤器不工作

views.py

class InvoiceViewSet(viewsets.ViewSet): 
    serializer_class = InvoiceSerializer 
    filter_backend = filters.DjangoFilterBackend 
    filter_fields = ('status','supplier',) 

    def list(self,request,): 
     queryset = Invoice.objects.filter() 
     serializer = InvoiceSerializer(queryset, many=True) 
     return Response(serializer.data) 

    def retrieve(self, request, pk=None): 
     queryset = Invoice.objects.filter() 
     invoice = get_object_or_404(queryset, pk=pk) 
     serializer = InvoiceSerializer(invoice) 
     return Response(serializer.data) 

class InvoiceItemViewSet(viewsets.ViewSet): 

    serializer_class = InvoiceItemSerializer 

    def list(self,request,invoice_pk=None): 
     queryset = InvoiceItem.objects.filter(invoice=invoice_pk) 
     serializer = InvoiceItemSerializer(queryset,many=True) 
     return Response(serializer.data) 


    def retrieve(self,request,pk,invoice_pk): 
     queryset = InvoiceItem.objects.filter(pk=pk,invoice=invoice_pk) 
     invoice_item = get_object_or_404(queryset,pk=pk) 
     serializer = InvoiceItemSerializer(invoice_item) 
     return Response(serializer.data) 

url.py

from django.conf.urls import url, include 
#viewset 
from rest_framework_nested import routers 
from payables.views import InvoiceViewSet,InvoiceItemViewSet 

router = routers.SimpleRouter() 
router.register(r'invoices', InvoiceViewSet,base_name='invoices') 

invoice_item_router = routers.NestedSimpleRouter(router,r'invoices',lookup='invoice') 
invoice_item_router.register(r'items', InvoiceItemViewSet, base_name='invoice_items') 

urlpatterns = [ 
    url(r'^',include(router.urls)), 
    url(r'^',include(invoice_item_router.urls)) 
    ] 

回答

1

这是因为你明确地创建查询集,因此从未使用的过滤器后端:

queryset = Invoice.objects.filter() 

我建议t看着ModelViewSet。在这种情况下,您只需在视图级别通过queryset,休息将被照顾。

+0

嗨,我如何查询集正确地传递到 “查看级别”?我应该向InvoiceViewSet中的列表函数添加另一个参数吗?例如def list(self,request,queryset):? –

+0

你在使用'ModelViewSet'吗?如果是,那么你可以按照文档,看看它如何声明查询集。 – AKS

+1

确定了,阅读文档,谢谢! –

1

代替queryset = Invoice.objects.filter()

使用queryset = self.get_queryset()

self.get_queryset()返回筛选对象列表