我使用的Django的REST框架的HyperlinkedModelSerializer,ModelViewset和defaultrouter和具有良好的网址,像这样结束:http://localhost:8000/api/users/1
。我想给定一个用户ID,为该用户找到完全合格的url,而无需对任何内容进行硬编码。给定53,我想要http://localhost:8000/api/users/1
,并且当我投入生产时,主机应该更改。
# from urls.py
router = routers.DefaultRouter()
router.register(r'users', shared_views.UserViewSet)
# from models.py
class UserViewSet(viewsets.ModelViewSet):
'''
endpoint for viewing/editing users
'''
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
# from serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
我怎样才能做到这一点?我试过:reverse(UserViewSet.as_view({'get': 'retrieve'}), args=[request.user.id])
但是出现了这个错误:
找不到带有参数“(1,)”和关键字参数“ {}”的“ shared.views.UserViewSet”。尝试了0个模式:[]
正如@Anush所说,我可以使用序列化器来获取URL。该请求需要以特定方式作为关键字参数传递(请参见下文):
class OwnedViewSet(viewsets.ModelViewSet):
''' ModelViewSets that use hyperlinked model serializers
can inherit this to automatically
set `owner` = current user.
'''
def create(self, request, *args, **kwargs):
serialized_owner = UserSerializer(request.user, context={'request': request})
request.data['owner'] = serialized_owner.data['url']
return super(OwnedViewSet, self).create(request, *args, **kwargs)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句