我正在构建一个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)),
我的模型是这样的:
class MyObject(models.Model):
name = models.TextField()
我的序列化程序如下所示:
class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyObject
fields = ('id', 'name',)
我的视图集如下所示:
class MyObjectsViewSet(viewsets.ViewSet):
def retrieve(self,request,pk=None):
queryset = MyObjects.objects.get(pk=pk).customMyObjectList()
if not queryset:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
serializer = MyObjectSerializer(queryset)
return Response(serializer.data,status=status.HTTP_200_OK)
当我点击/api/myObjects/60/I时,得到以下错误:
base_name
argument not specified, and could not automatically determine the name from the viewset, as it does not have a.model
or.queryset
attribute.
我从here了解到,我的路由上需要一个基名称参数。但在文档中,我不清楚这个base_name参数的值应该是什么。有人能告诉我用大本营的名字应该是什么样的路线吗?
也许您只需要为您的路由器设置
base_name
参数,在您的情况下,该参数的对象名为MyObject
。http://www.django-rest-framework.org/api-guide/routers/#Usage
让我解释一下,为什么我们首先需要一个基本名称,然后让我们讨论一下基本名称的可能值。
如果您以前在没有rest框架(DRF)的情况下使用过Django url,那么您应该这样指定它:
这里,如果您看到,有一个name参数,用于标识当前命名空间(即app)中的url。
这正是django rest框架试图自动执行的操作,因为drf知道视图是列表还是细节(因为viewset)。它只需要附加一些前缀来区分url。这就是基本名称(前缀)的目的。
在大多数情况下,您可以将url或资源名指定为基本名称。在您的示例中,base_name=myobject。DRF将生成基本名称+视图类型作为名称参数,如myobject_list&;myobject_detail。
注意:通常,基本名称将自动从查询集字段(从视图)获取,因为它对于视图集中的所有视图类型都是相同的。但是,如果您指定,get-queryset方法而不是queryset,则可能意味着您对不同的视图类型(如list、detail)有不同的queryset。因此,DRF将要求您为一个资源的所有视图类型指定一个通用的基名称。
尝试在url.py中执行此操作。第三个参数“Person”可以是任何您想要的参数。
相关问题 更多 >
编程相关推荐