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