程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django rest_framwork 自定義內容的API

編輯:Python

摘要

在知道與認識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的樣例的卻可以看到,所以路由注冊了但是沒有生效?

 

 

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved