gpt4 book ai didi

python - Django-filters 不适用于 Viewset

转载 作者:行者123 更新时间:2023-11-28 22:16:10 25 4
gpt4 key购买 nike

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

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

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

View 集-

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

权限-

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

后置过滤器 -

class PostFilter(filters.FilterSet):

class Meta:
model = Post
fields = ('pet_age', 'pet_gender', 'breed', )

经理 -

class PostManager(models.Manager):

def active(self):
return self.filter(post_status='Active')

我们将不胜感激任何帮助。

最佳答案

好的,所以终于从DRF Docs找到了解决方案.问题是,在普通 ViewSet 的情况下,您必须重写方法 filter_queryset() 并相应地返回适当的queryset。然后使用 filter_queryset 下的 queryset,如 Aman 所述-

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

下面是代码,供遇到问题的 friend 引用——

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

关于python - Django-filters 不适用于 Viewset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52366296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com