我正在构建一个Django应用程序,它公开了一个REST API,用户可以通过它查询我的应用程序的模型。我按照说明here。
我的路线在myApp的url.py中显示如下:
from rest_framework import routers
router = routers.DefaultRouter() router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet)
url(r'^api/', include(router.urls)),
我的Serializer看起来像这样:
class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyObject
fields = ('id', 'name',)
我的视图集如下所示:
class MyObjectsViewSet(viewsets.ModelViewSet):
queryset = MyObjects.objects.get(pk=self.kwargs['id'])
serializer_class = MyObjectSerializer
当我点击/ api / myObjects / 60 /时,我从Viewset的第一行收到以下错误:
name 'self' is not defined
为什么?如何在视图集中获取60的ID并获取具有该ID的MyObject?
答案 0 :(得分:5)
我会使用ViewSet作为ModelViewSet的反对者。除非有充分的理由使用ModelViewSet,否则下面的代码应该可以满足您的需求。如果您转到说http://yourdomain/yourmodel/10
的网址,则pk变量的值为10.
class YourModelViewSet(viewsets.ViewSet):
def retrieve(self,request,pk=None):
u = request.user
queryset = YourModel.objects.filter(user=u,pk=pk)
if not queryset:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
serializer = YourModelSerializer(queryset)
return Response(serializer.data,status=status.HTTP_200_OK)
谢谢 - 希望有所帮助
答案 1 :(得分:1)
如果您希望(或需要)坚持使用viewsets.ModelViewSet
,仍然可以从操作方法的kwargs
参数中访问ID。
class MyObjectViewSet(viewsets.ModelViewSet):
def update(self, request, *args, **kwargs):
obj_id = kwargs['pk']
obj = MyObject.objects.get(pk=obj_id)
# Do your thing
# Send back response
答案 2 :(得分:0)
您的记录器行正在引用self,但在该上下文中没有self(您在类级别,而不是在方法内)。尝试删除记录器行。
答案 3 :(得分:0)
由于您正在使用viewsets.ModelViewSet
,Django Rest Framework会为您处理特定对象的所有过滤。将您的queryset
媒体资源更改为MyObjects.objects.all()
。
覆盖其他人建议的queryset
会导致/myObjects/
路由中断,因为id
不存在。