Django 1.8 + DRF 3.4 + Django过滤器1.0.1不适用于ViewSets方法

时间:2017-05-21 15:00:38

标签: python django django-rest-framework django-filter

我正在尝试使用带有django-rest-framework的django-filters来实现基于get / url / params的过滤器,但它不适用于 viewsets 并且没有显示任何错误。例如,如果我使用generics.ListAPIView,过滤器可以完美运行!我的项目代码:

Models.py

class OrderFeedBack(BaseModel):
    """
    Receive the customer rating, vendor and staff feedback about a order.

    Once the vendor or the customer has written his feedbacks, they can't change it.

    Developer: gcavalcante8808
    """
    rating = models.IntegerField()
    customer_feedback = models.CharField(max_length=255, null=True, blank=True)
    vendor_feedback = models.TextField(null=True, blank=True)
    staff_feedback = models.TextField(null=True, blank=True)
    order = models.ForeignKey("Order")
    locked = models.BooleanField(default=False)

Filters.py

class OrderFeedBackViewSet(viewsets.ViewSet):
    authentication_classes = (TokenAuthentication, SessionAuthentication)
    permission_classes = (IsAuthenticated,)
    filter_class = (OrderFeedBackFilter,)
    filter_backend = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'locked')
    search_fields = ('id', 'order',)


    def list(self, request):
        """
        List all Order Feedbacks.

        ---
        serializer: app.api_v1.serializers.OrderFeedBackSerializer
        omit_serializer: false

        responseMessages:
            - code: 401
              message: AuthenticationNeeded

            - code: 200
              message: List of Feedbacks.

        """
        data = OrderFeedBack.objects.all()
        serializer = OrderFeedBackSerializer(data, many=True)

        return Response(serializer.data)

Serializers.py

class OrderFeedBackSerializer(serializers.ModelSerializer):
    order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all())

    class Meta:
        model = OrderFeedBack

甚至,如果我从“filter_class”中删除FieldSet类或尝试使用“filter_class = OrderFeedBackFilter”它也不会有效。我的virtualenv中安装了以下库(以及我的settings.py中的setUp) :

Django==1.8.18
DjangoRestFramework==3.3
Django-Filters==1.0.1
Django-Crispy-Forms

我正在使用python 2.7。

查看runserver日志,也没有错误。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

django过滤器可以自动使用通用视图,因为如果您查看源代码,它会使用过滤器类来过滤掉查询。

但是在您的列表方法中,您没有过滤掉查询,因此它无法正常工作。使用模型视图集[1]使过滤器类自动工作。模型视图集继承自通用API视图。

通用api视图类有一个名为0的方法,用于过滤查询。

[1] http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

答案 1 :(得分:0)

基础APIView(以及扩展名,基础ViewSet)不提供与Django模型的任何集成。这包括调用各种过滤后端(例如,DjangoFilterBackend),这些后端旨在与模型一起使用。您希望继承GenericAPIViewSet