在 Django Rest Api 中,你如何 return 只有所有者上传的项目

In Django Rest Api, how do you return only the Items the owner uploaded

Viewset def 列表如下所示:

class ThreeDimensionalModelViewSet(viewsets.ViewSet):
    serializer_class = ThreeDimensionalModelSerializer
    queryset = ThreeDimensionalModel.objects.all()
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def list(self, request):
        models = ThreeDimensionalModel.objects.all()
        serializer = ThreeDimensionalModelSerializer(models, many=True)
        print(request.user.id)
        return Response(serializer.data)

序列化程序如下所示:

class ThreeDimensionalModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = ThreeDimensionalModel
        fields = ['File', 'Uploaded', 'Owner', 'Previous', 'SharedWithUser']
        read_only_fields = ['Owner']

模型看起来像这样:

class ThreeDimensionalModel(models.Model):
    File = models.FileField(upload_to='models')
    Owner = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True, related_name='Owner')
    Uploaded = models.DateTimeField(auto_now_add=True)
    Previous = models.ForeignKey("self", on_delete=models.SET_NULL, default=None, null=True)
    SharedWithUser = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='SharedWithUser')

当用户在 /api/models 请求模型时,它应该只显示与他拥有相同所有者 ID 的模型。

如果该请求没有发送额外的数据,那么显然您不能按用户过滤。

最直接的方法是,对于登录用户,cookie 将包含用户信息,例如 userId。

当您的端点识别出发出请求的用户已登录时,它将使用它作为查询的过滤器,而不是 Django 文档中所见的 all() https://docs.djangoproject.com/en/3.2/topics/db/queries/#retrieving-specific-objects-with-filters

总而言之 - 如果用户未登录(或以某种方式提供信息作为请求的一部分),则请求是 匿名 并且无法知道是谁做的