在我的路由中需要什么基名称参数才能使这个Django API工作?

2024-10-08 23:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个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参数的值应该是什么。有人能告诉我用大本营的名字应该是什么样的路线吗?


Tags: namefrom模型应用程序urlherestatusnot
3条回答

也许您只需要为您的路由器设置base_name参数,在您的情况下,该参数的对象名为MyObject

router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet, base_name="MyObject")

http://www.django-rest-framework.org/api-guide/routers/#Usage

让我解释一下,为什么我们首先需要一个基本名称,然后让我们讨论一下基本名称的可能值。

如果您以前在没有rest框架(DRF)的情况下使用过Django url,那么您应该这样指定它:

urlpatterns = [
    url(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsListView.as_view(), name='myobject-list'),
    url(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsDetailView.as_view(), name='myobject-detail'),
]

这里,如果您看到,有一个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”可以是任何您想要的参数。

router.register(r'person/food', views.PersonViewSet, 'Person')

相关问题 更多 >

    热门问题