Django rest framework 在Django Rest框架中使用用户用户名作为url

Django rest framework 在Django Rest框架中使用用户用户名作为url,django-rest-framework,Django Rest Framework,我正在尝试使用用户的用户名作为URL,以便 访问用户详细信息,网址: 在我的URL.py中,我有 from django.urls import path from .views import UserViewSet from django.conf.urls import url from rest_framework.routers import DefaultRouter urlpatterns = [ path("users/", UserListView.as_view()

我正在尝试使用用户的用户名作为URL,以便 访问用户详细信息,网址:

在我的URL.py中,我有

from django.urls import path
from .views import UserViewSet
from django.conf.urls import url
from rest_framework.routers import DefaultRouter

urlpatterns = [
    path("users/", UserListView.as_view(), name="all-users"),
    path("users/<slug>/", UserViewSet),

]
序列化程序.py

from rest_framework import serializers
from rest_framework.relations import HyperlinkedIdentityField
from django.contrib.auth.models import User
class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
         model = User
         fields = ('url', 'username', 'email', 'id')
         slug_field = 'username'
每当我尝试转到个人用户页面时,我都会得到这样的结果 错误:TypeError位于/api/users/usernamegoesere/ init()接受1个位置参数,但给出了2个

谢谢大家!

更改路径(“用户//”,用户视图集),


path(“users/”,UserViewSet.as_view()),

您可以在一个简单的视图集中完成所有操作(事实上,模型视图集有全部4个操作-列表、创建、更新和删除)。只需设置viewset上的属性即可

使用视图集时,还应使用路由器。一般来说,要坚持原则。仔细阅读另一本,但它很少是你想要的

class UserViewSet(ModelViewSet):
    serializer_class = UserSerializer
    lookup_field = "username"

    def get_queryset(self):
        return User.objects.all()


user_router = SimpleRouter()
user_router.register("users", UserViewSet, basename="users")

urlpatterns = [
    # other url patterns you have
]
urlppatterns += user_router.urls
您可以运行
/manage.py show_url
查看已创建的路由。您应该会在其中看到类似于
。/users/
的内容

注意:虽然在设置URL时可以直接使用
ViewSet
,但通常不应该这样做。路由器负责创建和映射这些方法,并为它们指定适当的名称,以便可以预期地反转它们。它还处理映射可以添加到视图集中的
@action
方法

如果您必须手动执行此操作,那么您可能应该使用
ApiView
,每个路径一个

class UserViewSet(ModelViewSet):
    serializer_class = UserSerializer
    lookup_field = "username"

    def get_queryset(self):
        return User.objects.all()


user_router = SimpleRouter()
user_router.register("users", UserViewSet, basename="users")

urlpatterns = [
    # other url patterns you have
]
urlppatterns += user_router.urls