首页 > 解决方案 > Django DRF:ModelMixin Viewset:如何创建视图集以获取用户详细信息并编辑用户详细信息,而无需在 url 中传递 id

问题描述

假设我的用户已登录并且他想查看用户详细信息

我想创建一个 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

解决方案

在检查了一些帖子之后,我想要的是没有lookup_field然后覆盖的东西get_object。类似于没有查找字段的 RetrieveAPIView 的东西?

剩下的问题 如何避免lookup_field我试过了

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

但它给出了错误

django.core.exceptions.ImproperlyConfigured: "^userdetail/(?P<>[^/.]+)/$" is not a valid regular expression: missing group name at position 18

标签: djangodjango-rest-framework

解决方案


Subclass UserDetailsViewSet from generics.RetrieveUpdateAPIView and override get_object

Example:

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

register the view outside the drf router.

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


推荐阅读