使用 django rest 框架的自定义 URL
custom URLs using django rest framework
我正在尝试使用 django rest 框架将我的模型公开为 API。
序列化器
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
视图集
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for User details and list
"""
serializer_class = UserSerializer
queryset = User.objects.all()
路由器
router.register(r'users',views.UserViewSet)
虽然这暴露了 /users/ 和 users/,但我希望我的 URLs 也包含一个 user-slug,比如 /users/1/xyz-user-name.
有人解决过这个问题吗?这是否需要更改视图集和路由器代码,或者它是否只能在路由器代码中配置?我的 "slug" 并不是真正用于确定 url 路由,它只是为了 URL 可读性。
有什么指点吗?
您应该在序列化程序和视图集中设置 lookup_field
属性。
在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')
我能够使用此处发布的方法来实现它。
我收到的第二个错误是因为我在元部分中包含了 url 定义。它应该在元部分之前。我还必须在视图集代码中指定查找字段。这是我的代码的相关部分。
urls.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'))
]
views.py:
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for user details and user list
"""
lookup_field = 'id'
serializer_class = UserSerializer
queryset = user.objects.all()
serializers.py
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')
我正在尝试使用 django rest 框架将我的模型公开为 API。
序列化器
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
视图集
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for User details and list
"""
serializer_class = UserSerializer
queryset = User.objects.all()
路由器
router.register(r'users',views.UserViewSet)
虽然这暴露了 /users/ 和 users/,但我希望我的 URLs 也包含一个 user-slug,比如 /users/1/xyz-user-name.
有人解决过这个问题吗?这是否需要更改视图集和路由器代码,或者它是否只能在路由器代码中配置?我的 "slug" 并不是真正用于确定 url 路由,它只是为了 URL 可读性。
有什么指点吗?
您应该在序列化程序和视图集中设置 lookup_field
属性。
在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')
我能够使用此处发布的方法来实现它。
我收到的第二个错误是因为我在元部分中包含了 url 定义。它应该在元部分之前。我还必须在视图集代码中指定查找字段。这是我的代码的相关部分。
urls.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'))
]
views.py:
class UserViewSet(viewsets.ModelViewSet):
"""
API end point for user details and user list
"""
lookup_field = 'id'
serializer_class = UserSerializer
queryset = user.objects.all()
serializers.py
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')