Python 使用django rest框架的自定义URL

Python 使用django rest框架的自定义URL,python,django,routing,django-rest-framework,Python,Django,Routing,Django Rest Framework,我试图使用django rest框架将我的模型公开为API 序列化程序 class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User router.register(r'users',views.UserViewSet) 视图集 class UserViewSet(viewsets.ModelViewSet): """ API end poi

我试图使用django rest框架将我的模型公开为API

序列化程序

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
router.register(r'users',views.UserViewSet)
视图集

class UserViewSet(viewsets.ModelViewSet):
    """
    API end point for User details and list
    """
    serializer_class = UserSerializer
    queryset = User.objects.all()
路由器

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
router.register(r'users',views.UserViewSet)
虽然这会公开/users/和users/,但我希望我的URL也包含一个用户slug,类似于/users/1/xyz用户名

有人解决了这个问题吗?这是否需要同时更改视图集和路由器代码,还是只能在路由器代码中配置?我的“slug”并没有真正用于确定url路由,它只是用于url可读性


有任何指针吗?

您应该在序列化程序和视图集中设置
lookup\u字段
属性

在serializers.py中:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'user_slug')
        lookup_field = 'user_slug'
        extra_kwargs = {
            'url': {'lookup_field': 'user_slug'}
        }
在viewsets.py中:

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    lookup_field = ('user_slug')

我能够通过使用这里发布的方法来实现这一点

我收到的第二个错误是因为我在meta部分中包含了url定义。它应该在元节之前。我还必须在viewset代码中指定lookup字段。下面是我代码的相关部分

url.py

from user.views import UserViewSet
user_list = UserViewSet.as_view({'get':'list'})
user_detail = UserViewSet.as_view({'get':'retrieve'})

urlpatterns= [
    url(r'^users/$', user_list, name='user-list'),
    url(r'^user/(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', user_detail, name='user-detail'),
    url(r'^api-auth/', include('rest_framework.urls',namespace = 'rest_framework'))
]
class UserSerializer(serializers.HyperlinkedModelSerializer):
    url = ParameterisedHyperlinkedIdentityField(view_name='user-detail', lookup_fields=(('id', 'id'), ('slug', 'slug')), read_only=True)

    class Meta:
        model = user
        fields = ('url','name','cover_photo')
序列化程序.py

from user.views import UserViewSet
user_list = UserViewSet.as_view({'get':'list'})
user_detail = UserViewSet.as_view({'get':'retrieve'})

urlpatterns= [
    url(r'^users/$', user_list, name='user-list'),
    url(r'^user/(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', user_detail, name='user-detail'),
    url(r'^api-auth/', include('rest_framework.urls',namespace = 'rest_framework'))
]
class UserSerializer(serializers.HyperlinkedModelSerializer):
    url = ParameterisedHyperlinkedIdentityField(view_name='user-detail', lookup_fields=(('id', 'id'), ('slug', 'slug')), read_only=True)

    class Meta:
        model = user
        fields = ('url','name','cover_photo')

用于获取UserViewSet端点的详细信息。或者邮寄。谢谢。。但我的要求仍然是按主键查找,但最终的url也应该有slug。传递主键和slug feild。尝试后,我得到“\uuu init\uuuu()得到了一个意外的关键字参数'id'”谢谢Seenu。lookupfield有助于显示细节视图,但是为了使链接具有id和url,我必须创建一个新类。我发布了一个包含详细信息的答案。如果我有一个名为articles的表,我们可以添加多个查找字段吗?当我在django 2.2中使用
as_view({'get':'retrieve')
时,我可以添加如下内容:
lookup_field=('id','slug')