【问题标题】:Django 1.8 + DRF 3.4 + Django Filters 1.0.1 Won't Work on ViewSets MethodsDjango 1.8 + DRF 3.4 + Django Filters 1.0.1 不适用于 ViewSets 方法
【发布时间】:2017-10-21 06:04:00
【问题描述】:

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

模型.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)

过滤器.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)

序列化器.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。

查看运行服务器日志,也没有错误。 提前致谢。

【问题讨论】:

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


    【解决方案1】:

    django 过滤器自动与通用视图一起工作,因为如果您查看源代码,它正在使用过滤器类来过滤查询。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 他宁愿继承viewsets.ModelViewSet而不是viewsets.ViewSet。这提供了与模型的集成
      猜你喜欢
      • 2019-02-21
      • 2019-01-09
      • 2014-07-07
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2022-10-25
      • 2017-05-28
      相关资源
      最近更新 更多