如何使用 DRF 中的 ModelViewSet 按当前经过身份验证的用户过滤模型

问题描述 投票:0回答:1

我正在使用 Django Rest Framework 开发 Django 项目。我有一个名为

Server
的模型,我想通过当前经过身份验证的用户过滤
queryset
,但前提是查询参数中提供了“by_user=true”。我正在使用
ModelViewSet
创建 API 端点。我已经覆盖了
get_queryset
并且工作正常。但是当我返回时使用
super().list(request, *args, **kwargs) 
它返回查询集而不进行过滤。我发现返回过滤后的查询集的唯一方法是使用
Response(serializer.data)
。但我想用
super().list()
方法。任何帮助,将不胜感激。预先感谢。

这是

Server Model

class Server(Model):
    name = CharField(max_length=100)
    owner = ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=CASCADE, related_name="server_owner"
    )
    category = ForeignKey(Category, on_delete=CASCADE, related_name="server_category")
    description = CharField(max_length=300, blank=True, null=True)
    members = ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="server_members", blank=True
    )

    def __str__(self):
        return self.name

这是

Serializer

class ServerSerializer(ModelSerializer):
    class Meta:
        model = Server
        fields = "__all__"

这是

ViewSet

class ServerViewSet(ModelViewSet):
    queryset = Server.objects.all()
    serializer_class = ServerSerializer
    filter_backends = [DjangoFilterBackend, OrderingFilter]
    filterset_class = ServerFilter

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        by_user = request.query_params.get("by_user", False)
        if by_user:
            queryset = queryset.filter(members=request.user)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
        # return super().list(request, *args, **kwargs)
django django-rest-framework django-serializer django-filter django-rest-viewsets
1个回答
0
投票

super()
关键字用于从继承/父类调用方法和属性,在您的情况下
ModelViewset

返回

super().list()
将调用
.list()
类中定义的
ModelViewset
方法,而不是您在
ServerViewSet
类中定义的方法。

请记住,

.list()
类中的
ModelViewset
方法不会过滤数据,这就是为什么您在
ServerViewset
类中重写了它,以便可以过滤数据。 因此,您只需使用
return Response(serializer.data)
返回过滤后的数据或查询集。

您的情况无需使用

super().list()

© www.soinside.com 2019 - 2024. All rights reserved.