Vir*_*liu 31 django django-rest-framework
是否可以使用对象的slug(或任何其他字段)来访问项目的详细信息,而不是使用ID?
例如,如果我有一个带有slug"lorem"和ID 1的项目.默认情况下,URL是http://localhost:9999/items/1/.我希望通过它来访问它http://localhost:9999/items/lorem/.
添加lookup_field序列化程序的Meta类没有改变自动生成的URL,也没有允许我通过手动编写slug而不是URL中的ID来访问该项目.
models.py
class Item(models.Model):
slug = models.CharField(max_length=100, unique=True)
title = models.CharField(max_length=100, blank=True, default='')
# An arbitrary, user provided, URL
item_url = models.URLField(unique=True)
Run Code Online (Sandbox Code Playgroud)
serializers.py
class ClassItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Item
fields = ('url', 'slug', 'title', 'item_url')
Run Code Online (Sandbox Code Playgroud)
views.py
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
Run Code Online (Sandbox Code Playgroud)
urls.py
router = DefaultRouter()
router.register(r'items', views.ItemViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
Run Code Online (Sandbox Code Playgroud)
生成的JSON:
[
{
"url": "http://localhost:9999/items/1/",
"slug": "lorem",
"title": "Lorem",
"item_url": "http://example.com"
}
]
Run Code Online (Sandbox Code Playgroud)
Ily*_*nov 54
你应该lookup_field在你的序列化器中设置:
class ItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Item
fields = ('url', 'slug', 'title', 'item_url')
lookup_field = 'slug'
extra_kwargs = {
'url': {'lookup_field': 'slug'}
}
Run Code Online (Sandbox Code Playgroud)
在你看来:
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
lookup_field = 'slug'
Run Code Online (Sandbox Code Playgroud)
我得到了这个结果:
~ curl http://127.0.0.1:8000/items/testslug/ | python -mjson.tool
{
"item_url": "https://example.com/",
"slug": "testslug",
"title": "Test Title",
"url": "http://127.0.0.1:8000/items/testslug/"
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,您可能希望同时拥有“低级”pk值和更语义化的slug。我想有两种选择亲自并通过设置这样做lookup_field的视图集中后as_view()的方法在我的urls.py。
注意:以下默认
pk使用可选slug查找。要将其与先前的答案结合起来,您可以将lookup_field以下内容更改"pk"为"slug".
from django.conf.urls import *
from rest_framework.urlpatterns import format_suffix_patterns
from myobjects import views as myviews
# simplify the view definitions by splitting out the options
REQDICT = {
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
}
# define the pk detail view
myobject_detail = myviews.MyObjectViewset.as_view(REQDICT)
# define the slug detail view
myobject_slug_detail = myviews.MyObjectViewset.as_view(REQDICT, lookup_field='slug')
urlpatterns = [
url(r"^myobjects/(?P<pk>\d*)/$",
myobject_detail,
name = 'myobject-detail'),
url(r"^myobjects/(?P<slug>[-\w]+)/$",
myobject_slug_detail,
name = 'myobject-slug-detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
Run Code Online (Sandbox Code Playgroud)
这也可能在您的范围内
views.py- 我更喜欢在urlpatterns列表旁边看到它。
| 归档时间: |
|
| 查看次数: |
13269 次 |
| 最近记录: |