摘要
在知道与认识django rest_framwork并且还不怎么认识的几十分钟里,就想着自定义自己的接口内容,但是我看样例以及网友们的例子,只有关于模型的viewset,主要是我自己瞎写的它不work。粗看了几遍给的文档,好像也没有说模型之外的接口怎么操作,要覆盖什么函数之类的也没有 。
问题核心,Djangorestframwork建立模型无关的 API |Django rest framwork without model | Django rest framwork without query_set
环境
Django==3.1.7
djangorestframework==3.12.4
相关问题与内容
-
router.register中basename有什么用
-
定义接口ping自定义响应内容pong
-
出现的些什么问题
-
should either include a `queryset` attribute, or override the `get_queryset()` method.
-
路由注册了但是没有生效
-
'Ping_ViewSet' should either include a `queryset` attribute, or override the `get_queryset()` method.
-
结论
- rest_framwork.router.register 只能注册ViewSet
- APIview可以实现与模型无关或没有queryset模型的直接返回自定义内容,但不能用drf的router注册
- 坑之url名字不能叫ping-->参见 Django url 名字不能叫ping 的奇怪现象
解决方案
使用APIView实现
使用装饰器api_view实现
探索过程
问题:should either include a `queryset` attribute, or override the `get_queryset()` method.
class User_Serializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email',)
class User_ViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = User_Serializer
#######here mine
class Ping_ViewSet(viewsets.GenericViewSet):
'''
ping<---->
'''
pass
def get(self,request,*k,**kw):
pass
def post(self,request,*k,**kw):
pass
router = DefaultRouter()
router.register(r'users', User_ViewSet)
router.register(r'ping', Ping_ViewSet)
urlpatterns = [
path('', include(router.urls)),
]
问题原因:在我的Ping_ViewSet中没有定义query_set属性,可能对于模型的父类就找不到数据展现吧,这时候需要在register添加中添加basename参数
'basename' argument not specified, and could not automatically determine the name from the viewset, as it does not have a '.queryset' attribute.
翻译就是:basename参数没有指定,并且不能自动的确定viewset的名字来源,因为它没有 '.queryset'属性
好的加上basename,仿照别人的basename,也不知道值应该写啥
router.register(r'ping', plum.Ping_ViewSet,basename='ping')
确实不报错了,但是我却不能访问我的ping接口,在APIroot(访问your_server:port)中甚至都看不到影子,quickstart的样例的却可以看到,所以路由注册了但是没有生效?