我正在使用 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)
super()
关键字用于从继承/父类调用方法和属性,在您的情况下ModelViewset
。
返回
super().list()
将调用 .list()
类中定义的 ModelViewset
方法,而不是您在 ServerViewSet
类中定义的方法。
请记住,
.list()
类中的ModelViewset
方法不会过滤数据,这就是为什么您在ServerViewset
类中重写了它,以便可以过滤数据。
因此,您只需使用 return Response(serializer.data)
返回过滤后的数据或查询集。
您的情况无需使用
super().list()
。