Как сделать 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