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