Django构建一个非常好的API

时间:2017-09-25 17:20:05

标签: python django django-rest-framework

我想构建一个允许我渲染多种数据变体的Django 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时所做的那样,在使用一种模型时呈现不同的数据变体?

1 个答案:

答案 0 :(得分:0)

Sinc你的标题表明你想要创建一个RESTfull api,你应该使用django-rest-framework和django来简化你的api设计中的RESTfull部分。

DRF有一个很好的教程,你应该通过,因为一个专业的&#39;具有多个响应中的响应的api不是初学者挑战。 值得庆幸的是DRF让你满意,因为它带有一些所谓的渲染器。渲染器基本上负责您的数据呈现的格式,例如html,json等。此外,DRF可以处理自定义渲染器,因此您可以轻松地将其扩展到您的需求。

如果您想在整体RESTfull API设计方面取得进展,我推荐https://apisyouwonthate.com/的书籍,作者和社区。作者&amp;社区=伟大的家伙+这本书让你快速上手(我与作者没有任何关系,只是认为这本书非常适合介绍REST)。