Django rest_framwork 自定义内容的API

摘要

在知道与认识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'属性

来源:https://www.django-rest-framework.org/api-guide/routers/

 好的加上basename,仿照别人的basename,也不知道值应该写啥

router.register(r'ping',  plum.Ping_ViewSet,basename='ping')

确实不报错了,但是我却不能访问我的ping接口,在APIroot(访问your_server:port)中甚至都看不到影子,quickstart的样例的却可以看到,所以路由注册了但是没有生效

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值