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(),)
...
]