【问题标题】:Django filter not workingDjango过滤器不起作用
【发布时间】:2016-10-08 05:49:31
【问题描述】:

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

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))
    ]

【问题讨论】:

    标签: django python-3.x django-rest-framework django-filter


    【解决方案1】:

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

    queryset = Invoice.objects.filter()
    

    我建议查看ModelViewSet。在这种情况下,您只需在视图级别传递queryset,其余的将被处理。

    【讨论】:

    • 嗨,我如何正确地将查询集传递到“视图级别”?我应该向 InvoiceViewSet 中的列表函数添加另一个参数吗?例如 def list(self,request,queryset):?
    • 您使用的是ModelViewSet。如果是,那么您可以按照文档查看它是如何声明查询集的。
    【解决方案2】:

    而不是queryset = Invoice.objects.filter()

    使用queryset = self.get_queryset()

    self.get_queryset() 返回过滤后的对象列表

    【讨论】:

      【解决方案3】:

      而不是queryset = Invoice.objects.filter()

      queryset = self.filter_queryset(self.get_queryset()).filter()

      【讨论】:

        猜你喜欢
        • 2018-02-09
        • 2018-12-14
        • 2014-10-10
        • 2016-01-10
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 2017-07-30
        • 2015-06-18
        相关资源
        最近更新 更多