我正在尝试使用带有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日志,也没有错误。 提前谢谢。
答案 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
。