[英]best way to add additional fields to django-rest-framework ModelViewSet when create
[英]Add a HyperLink in django-rest-framework to a ModelViewSet
是否有可能在Django Rest Framework中在ModelViewSet 列表視圖中的每個記錄的id
字段上添加一個HyperLink
,鏈接到該記錄的詳細信息視圖 ?
文檔說要添加一個view_name
參數,但是這可以在ModelViewSet
下進行,因為視圖實際上沒有名稱嗎?
首先,所有ModelViewSet網址都有名稱,即使您沒有明確設置這些名稱。
您可以在文檔中找到如何在路由器中創建默認網址: http : //www.django-rest-framework.org/api-guide/routers/ (請參閱'SimpleRouter'網址名稱表)
要查看應用程序中可用的所有實際URL名稱,請嘗試使用此實用程序:
def print_url_pattern_names(patterns):
"""Print a list of urlpattern and their names"""
for pat in patterns:
if pat.__class__.__name__ == 'RegexURLResolver': # load patterns from this RegexURLResolver
print_url_pattern_names(pat.url_patterns)
elif pat.__class__.__name__ == 'RegexURLPattern': # load name from this RegexURLPattern
if pat.name is not None:
print '[API-URL] {} \t\t\t-> {}'.format(pat.name, pat.regex.pattern)
然后,在你的urls.py中:
urlpatterns = [
url(r'^', include(router.urls)),
]
if settings.DEBUG:
print_url_pattern_names(urlpatterns)
如果您希望url與ModelViewSet的名稱不同(在我的情況下),您可以使用“base_name”在路由器上設置它:
router.register('contents', media_views.MediaViewSet, base_name='contents')
接下來你需要的是擴展HyperlinkedModelSerializer:
from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
#blablabla
您將准備好序列化程序以顯示指向詳細信息視圖的超鏈接,但還有一個必需步驟可供使用。 這就是“view_name”的用武之地:
from rest_framework import serializers
class MediaSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Media
fields = ('url', ...[other fields you want to serialize])
extra_kwargs = {
'url': {'view_name': 'contents-detail'}
}
這是樣本的http響應(參見url字段):
對xleon的回答幾乎沒有更新:
使用Python 3和新的Django,函數來查看所有urlpatterns你應該使用這樣的東西:
def print_url_pattern_names(patterns):
"""Print a list of urlpattern and their names"""
for pat in patterns:
if pat.__class__.__name__ == 'URLResolver': # load patterns from this URLResolver
print_url_pattern_names(pat.url_patterns)
elif pat.__class__.__name__ == 'URLPattern': # load name from this URLPattern
if pat.name is not None:
print('[API-URL] {:>50} -> {}'.format(pat.name, pat.pattern))
我花了一些時間來解決它,所以也許它會幫助某人。
我是如何使用它的:然后運行“python manage.py shell”
import urls
然后復制此函數並像這樣運行:
print_url_pattern_names(urls.urlpatterns)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.