django - 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
解决方案
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(),)
...
]
推荐阅读
- javascript - Javascript 将 JSON 解析为表格 html
- python - 如何从 HTML 文件传递字符串以在 django 中查看?
- javascript - 如何使用开发人员工具启用元素的 mouseenter/mouseover 状态以进行调试?
- typescript - 在 propOr 上正确输入
- php - 发布php后的jQuery ajax返回值
- javascript - 控制器中的 Ajax 在 php 中无法正常工作
- javascript - 防止 socket.io 向套接字发送垃圾邮件
- view - 显示当前日期的页面浏览量
- r - 以另一种货币进行网络抓取(多种选择)
- rtweet - 警告:/1.1/statuses/user_timeline.json - 未授权。使用 rtweet 检索 realDonaldTrump 推文时