Как сделать CRUD данных, созданных только текущим пользователем в DRF?

Привет Я сейчас использую DjangoRESTFramework для создания API, который я буду получать в ReactJS. Мое приложение представляет собой систему управления проектами, где авторизованный пользователь может создавать новых клиентов и проекты каждого клиента. Теперь я хочу, чтобы мой DRF отправлял данные через API только те, которые созданы текущим/зарегистрированным пользователем. На данный момент я имею следующее:

serializers.py:

class Client Serializer(serializers.ModelSerializer):
   class Meta:
      model = Client
      fields = '__all__'

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
       model = Project
       fields = '__all__'

views.py

class ClientView(viewsets.ModelViewSet):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()
    permission_classes = [IsAuthenticated]
    authentication_classes = (TokenAuthentication, )

class ProjectView(viewsets.ModelViewSet):
    serializer_class = ProjectSerializer
    queryset = Project.objects.all()
    permission_classes = [IsAuthenticated]
    authentication_classes = (TokenAuthentication, )

Как я могу изменить это так, чтобы я мог получить доступ только к тем данным, которые созданы вошедшим в систему / текущим пользователем? Большое спасибо, заранее спасибо!

Вы можете переопределить queryset, используя get_queryset()

Решение:

def get_queryset(self):
  user = self.request.user
  queryset = Project.objects.filter(user=user)
  
  return queryset

Похоже на Client View

Надеемся помочь вам!

Вы можете использовать django-filter и затем использовать имя пользователя/id/email (или любые другие уникальные идентификаторы пользователя) в качестве параметров, например /clients/?user=1.

Но поскольку мне часто лень использовать параметры в react, я создаю специальные представления, которые возвращают нужные мне данные для текущего пользователя :-)

Eg на наборе представлений клиента с помощью действия DRF:

...
from rest_framework.decorators import action
from rest_framework.response import Response
...

class ClientView(viewsets.ModelViewSet):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()
    permission_classes = [IsAuthenticated]
    authentication_classes = (TokenAuthentication, )

    @action(methods=["get"], detail=False)
    def current_user_clients(self, request, *args, **kwargs):
        user = request.user
        clients = Client.objects.filter(user=user)
        serializer = self.get_serializer(clients, many=True)
        return Response(serializer.data)

Что дает вам url типа clients/current_user_clients/

Редактируйте: Если вам нужна пагинация в вашем действии, вы должны явно добавить ее, как описано здесь Как сделать пагинацию внутри действия в Django Rest Framework

Вернуться на верх