将Django视图中的代码重用到另一个vi中

2024-06-10 05:47:45 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个Django(1.8.9)函数视图,如下所示:

@api_view(['GET')]
def fruit_ranker(request):
"""
This view is responsible for generating the list of top 5
fruits based on sales
"""
****busines logic***
****busines logic***
****busines logic***
****busines logic***
....
....

然后,这个特定的视图被绑定到网址.py因此,http://127.0.0.1:8000/app_name/fruit-ranker给出了前5个水果的JSON输出。按预期工作。在

现在,我需要对前5种蔬菜执行相同的操作,并且它需要一个单独的URL,比如http://127.0.0.1:8000/app_name/veggie-ranker。因此,我创建了以下视图来绑定到这个URL,如下所示:

^{pr2}$

问题是业务逻辑是完全相同的,尽管对于SQL中的select语句,第一种情况下,我选择水果,在第二种情况下,我选择蔬菜。怎么吃我是否可以重用第一个视图中的所有现有代码,而不必再次重写它,也不必适应小的SQL更改?我是否可以将第一个视图作为装饰器添加到第二个视图中,这样我就可以抽象出所有代码,并允许我灵活地更改SL?在


Tags: 代码nameview视图apphttpurlsql
2条回答

如果创建通用ranker,例如:

def generic_ranker(request, field_or_model_name):
"""
This function is responsible for generating the list of top 5
field_or_model based on sales
"""

***business logic***
***business logic***
***business logic***
***business logic***

那么你的实际观点是:

^{pr2}$

但是,我想知道您为什么依赖函数视图。如果你快速地看一下Class based views,你会发现你可以如此高效地完成很多事情。在

虽然最好将两个视图分开(以防将来您想更改一个视图而不更改另一个视图),但是如果您希望使用一个视图,则可以这样做。在

def combined_view(request):
    if request.path == 'app_name/veggie-ranker/':
        # return top 5 vegitables
    else:
        # return top 5 fruites

或者您可以:

^{pr2}$

相关问题 更多 >