Django 过滤器不适用于视图集

5pa*_*1ug 5 python django django-filter django-rest-framework django-rest-viewsets

我一直在尝试使用django-filters,但对象没有被过滤。此外,该权限不适用于partial_update视图

我有一个视图集,它具有基本操作,例如 - list()、retrieve()、destroy()、partial_update() 和其他一些操作,并尝试对其应用过滤器。

经过一些研究,我发现由于我是通过过滤器创建查询集,因此我必须覆盖get_queryset()方法。但是,这似乎也不起作用。是否过滤仅适用于ModelViewSetListApiView

视图集 -

class PostViewSet(viewsets.ViewSet):
"""
The Endpoint to list, retrieve, create and delete Posts.

"""
filter_backends = (DjangoFilterBackend, )
# filterset_class = PostFilter
filter_fields = ('pet_age', 'pet_gender', 'breed')

def get_permissions(self):

    if self.action == 'partial_update' or self.action == 'update':
        permission_classes = [IsPostAuthor, ]

    elif self.action == 'create' or self.action == 'destroy':
        permission_classes = [IsAuthenticated, ]

    else:
        permission_classes = [AllowAny, ]

    return[permission() for permission in permission_classes]

def get_queryset(self):
    return Post.objects.active() # This is implemented via custom Manager

def list(self, request, *args, **kwargs):
    """
    Method for Post listing. It can be accessed by anyone.
    """

    serializer = PostListSerializer(self.get_queryset(), many=True, context={"request": request})

    return Response(serializer.data)
# REST CODE TRUNCATED
Run Code Online (Sandbox Code Playgroud)

允许 -

class IsPostAuthor(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
"""

def has_object_permission(self, request, view, obj):
    if request.user.is_authenticated:
        if view.action in ['partial_update', 'update']:
            return obj.user.id == request.user.id
        return False

    return False
Run Code Online (Sandbox Code Playgroud)

后过滤器 -

class PostFilter(filters.FilterSet):

class Meta:
    model = Post
    fields = ('pet_age', 'pet_gender', 'breed', )
Run Code Online (Sandbox Code Playgroud)

经理 -

class PostManager(models.Manager):

def active(self):
    return self.filter(post_status='Active')
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

5pa*_*1ug 10

好的,所以终于从DRF Docs找到了解决方案。问题是,在正常视图集中的情况下,你必须要覆盖的方法filter_queryset() ,并返回相应的查询集相应。然后使用查询集filter_queryset由提到阿曼-

serializer = PostListSerializer(self.filter_queryset(self.get_queryset()), many=True, context={"request": request})
Run Code Online (Sandbox Code Playgroud)

以下是仍然面临问题的人的参考代码 -

filter_queryset -

def filter_queryset(self, queryset):
    filter_backends = (DjangoFilterBackend, )

    # Other condition for different filter backend goes here

    for backend in list(filter_backends):
        queryset = backend().filter_queryset(self.request, queryset, view=self)
    return queryset
Run Code Online (Sandbox Code Playgroud)

  • 您可以与覆盖的查询集共享完整的视图集吗 (2认同)