Django DRF: ModelMixin Viewset: Как создать набор представлений для получения данных о пользователе и редактирования данных о нем без передачи id в url

Предположим, что мой пользователь вошел в систему и хочет посмотреть информацию о пользователе

Я хочу создать конечную точку api типа /userdetails/

На основе пользователя, который вошел в систему, он должен вернуть подробную информацию.

Это мой сериализатор

class UserDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = [
            "id",
            "email",
            "first_name",
            "last_name",
            "is_staff",
            "is_active",
            "date_joined",
            "last_login",
            "modified_date",
            "creation_date",
        ]
        read_only_fields = [
            "email",
            "is_staff",
            "is_active",
            "is_superuser",
            "date_joined",
            "last_login",
        ]

Теперь я хочу создать набор представлений для read and edit

Я хочу что-то вроде этого

class UserDetailsViewSet(
    mixins.UpdateModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet,
):
    queryset = User.objects.all()
    serializer_class = UserDetailsSerializer

и

router.register(r"userdetail",UserDetailsViewSet )

Но проблема в том, что я не хочу, чтобы урлы типа /userdetail/<pk> вместо этого только /userdetail. Потому что <pk> можно получить из request.user

Подкласс UserDetailsViewSet от generics.RetrieveUpdateAPIView и переопределить get_object

Пример:

class UserDetailsViewSet(
    generics.RetrieveUpdateAPIView
):
    queryset = User.objects.all()
    serializer_class = UserDetailsSerializer

    def get_object(self):
        queryset = self.filter_queryset(self.get_queryset())
        obj = get_object_or_404(queryset, pk=self.request.user.id)
        self.check_object_permissions(self.request, obj)
        return obj

зарегистрируйте представление вне маршрутизатора drf.

urlpatterns = [
    ...
    path('userdetail/', views.UserDetailsViewSet.as_view(),)
    ...
]

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