Python 将代码从Django视图重用到另一个视图中
因此,我有一个Django(1.8.9)功能视图,如下所示:Python 将代码从Django视图重用到另一个视图中,python,django,views,Python,Django,Views,因此,我有一个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*** .
@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***
....
....
然后将这个特定视图绑定到URL.py中的一个URL,为我提供前5个水果的JSON输出。一切正常
现在,我需要对前5种蔬菜执行相同的操作,并且它需要有一个单独的URL,如。因此,我创建以下视图以绑定到此URL,如下所示:
@api_view(['GET')]
def vegetable_ranker(request):
"""
This view is responsible for generating the list of top 5
vegetables based on sales
"""
问题是业务逻辑完全相同,尽管对于SQL中的select语句,在第一种情况下,我选择水果,在第二种情况下,我选择蔬菜。如何在第一个视图中重用所有现有代码,而不必再次重写它,也不必适应SQL的小更改?我是否可以以某种方式将第一个视图作为装饰器添加到第二个视图中,这样我就可以抽象所有代码,并允许我灵活地进行SL更改?如果您创建一个通用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***
那么您的实际视图将是:
@api_view(['GET')]
def vegetable_ranker(request):
"""
This view is responsible for generating the list of top 5
vegetables based on sales
"""
return generic_ranker(request, Vegetable)
@api_view(['GET')]
def fruit_ranker(request):
"""
This view is responsible for generating the list of top 5
vegetables based on sales
"""
return generic_ranker(request, Fruit)
但是,我想知道为什么要依赖函数视图。如果你快速看一看,你会发现你可以如此高效地完成很多事情 如果您创建一个通用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***
那么您的实际视图将是:
@api_view(['GET')]
def vegetable_ranker(request):
"""
This view is responsible for generating the list of top 5
vegetables based on sales
"""
return generic_ranker(request, Vegetable)
@api_view(['GET')]
def fruit_ranker(request):
"""
This view is responsible for generating the list of top 5
vegetables based on sales
"""
return generic_ranker(request, Fruit)
但是,我想知道为什么要依赖函数视图。如果你快速看一看,你会发现你可以如此高效地完成很多事情 尽管最好将两个视图分开(以防将来您想更改一个视图而不是另一个),但是如果您想使用一个视图,您可以这样做
def combined_view(request):
if request.path == 'app_name/veggie-ranker/':
# return top 5 vegitables
else:
# return top 5 fruites
或者你可以:
# in urls.py
url(r'^/(?P<return_type>.+)/$')
# in views.py
def combined_view(request, return_type):
if return_type == 'veggie-ranker':
# return top 5 vegetables
elif return_type == 'fruit-ranker':
# return top 5 fruits
else:
raise Http404
URL.py中的#
url(r'^/(?P.+)/$)
#in views.py
def组合视图(请求、返回类型):
如果return_type=='veggie ranker':
#返回前五名的蔬菜
elif return_type=='FROUT ranker':
#返回前五名的水果
其他:
提高Http404
尽管最好将两个视图分开(以防将来您想更改一个视图而不是另一个),但是如果您想使用一个视图,您可以这样做
def combined_view(request):
if request.path == 'app_name/veggie-ranker/':
# return top 5 vegitables
else:
# return top 5 fruites
或者你可以:
# in urls.py
url(r'^/(?P<return_type>.+)/$')
# in views.py
def combined_view(request, return_type):
if return_type == 'veggie-ranker':
# return top 5 vegetables
elif return_type == 'fruit-ranker':
# return top 5 fruits
else:
raise Http404
URL.py中的#
url(r'^/(?P.+)/$)
#in views.py
def组合视图(请求、返回类型):
如果return_type=='veggie ranker':
#返回前五名的蔬菜
elif return_type=='FROUT ranker':
#返回前五名的水果
其他:
提高Http404
+1我还建议对此类内容使用基于类的视图。您的问题可以通过使用一个具有所需功能的公共超类并只覆盖视图中的SQL查询来轻松解决。+1我还建议使用基于类的视图来解决这类问题。通过使用一个具有所需功能的公共超类,并且只覆盖视图中的SQL查询,可以很容易地解决您的问题。