В Django Rest Api, как вернуть только те предметы, которые загрузил владелец
Список дефов Viewset выглядит следующим образом:
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.
Когда ваша конечная точка распознает, что пользователь, сделавший запрос, вошел в систему, она будет использовать это в качестве фильтра для запроса вместо all(), как показано в документации Django https://docs.djangoproject.com/en/3.2/topics/db/queries/#retrieving-specific-objects-with-filters
Подведем итог - если пользователь не вошел в систему (или предоставляет информацию как часть запроса каким-либо способом), то запрос является анонимным и нет способа узнать, кто его сделал