2017-09-25 49 views
0

我想構建一個Django Api應用程序,該應用程序允許我呈現多個數據變體。例如看看我的代碼:Django構建一個Restful API

urlpatterns = [ 
    url(r'nav-func$', views.FundNavApi.as_view(option='nav_func')), 
    url(r'fund_nav/(?P<fund_id>[0-9]+)$', views.FundNavApi.as_view(option='fund_nav')) 
] 

Views.py

class FundNavApi(APIView): 
    option = 'default' 
    model_class = NAV 
    fund_id = None 

    def get(self, request, format=None): 
     if self.option == 'nav_func': 
      res = self.nav_func 
      print(res) 
     elif self.option == 'fund_nav': 
      print(self.kwargs['fund_id']) 
     return Response("Hi") 

    @staticmethod 
    def nav_func(): 
     querysets = NAV.objects.filter(fund__account_class=0, transmission=3).values(
     'valuation_period_end_date').annotate(
     total_nav=Sum(F('outstanding_shares_par') * F('nav'))).order_by('valuation_period_end_date') 

     df = read_frame(querysets, coerce_float=True) 
     df.loc[:, 'valuation_period_end_date'] = pd.to_datetime(df.valuation_period_end_date) 
     df.loc[:, 'timestamp'] = df.valuation_period_end_date.astype(np.int64) // 10 ** 6 
     df.loc[:, 'total_nav'] = df.total_nav 
     df = df.round(0) 
     print(df[['timestamp', 'total_nav']].values.tolist()) 
     return df[['timestamp', 'total_nav']].values.tolist() 

正如你所看到的,我想用同樣的model,但不同的操作基礎上url數據。所以,我使用option=''參數作爲告訴controller渲染的方法。所以我有兩個問題:

  1. 這是正確的方法嗎?就像這是專業人士在構建API時所做的一樣,它使用一種類型的模型呈現不同的數據變化?

回答

0

Sinc your title表示你想創建一個RESTfull api,你應該使用django的django-rest-framework來緩解你的api設計的RESTfull部分。

DRF有一個很好的教程,你應該努力通過,因爲在多個響應中的「專業」api響應不是初學者的挑戰。 謝天謝地,你介紹了DRF,因爲它帶有一些所謂的Renderer。渲染器基本上負責數據所呈現的格式,例如html,json等。另外,DRF可以處理自定義的Renderer,因此您可以輕鬆地將其擴展到您的需求。

如果你想在整體RESTfull API設計中取得突破,我推薦本書,作者和社區https://apisyouwonthate.com/。作者&社區=偉大的傢伙+本書能夠讓你儘快掌握速度(我對作者沒有任何關係,只是認爲這本書對於REST的介紹很棒)。