shu*_*doh 7 python django django-rest-framework
我有3个模型,彼此之间有一对多的关系.
想法是用户将创建模型A的实例(如股票投资组合),然后输入股票持有(模型C).模型B适合的地方是我想基于投资组合(模型A)中的股票(模型C)运行计算/逻辑,并使用另一个类/模型来跟踪事物使生活更轻松,因此模型B.
我最初在Django视图中有这些计算的逻辑,但在Django的两个Scoops中读取业务逻辑应该与视图分开.结果,我将逻辑移动到模型A(投资组合)的方法,现在从视图中调用该方法.这个逻辑循环通过股票持有并创建模型B的新实例,即结果.
我现在有兴趣探索django-rest-framework来为javascript前端提供API(比如Angular).我猜我在REST接口中无法进行这种数据操作.但是,此逻辑(模型B中的数据)的结果需要通过REST显示.因此,这种类型的计算/逻辑在哪里?
xle*_*eon 16
Django Rest Framework的主要部分是视图(ViewSets,ApiViews等)和序列化器.这些都不是编写逻辑的理想场所.正如您所提到的,在任何视图中编写逻辑都不是很好.为什么?
恕我直言,模型不是写逻辑的好地方.将模型视为数据库定义.我会让它们尽可能简单.您可以覆盖"保存"和其他方法来执行琐碎的任务.任何其他高级功能都应该在其之外.
我能想到你需要的两个更好的地方:
其中一个是django信号
一个更好的是自定义类.封装/解耦您自己的类中的逻辑(您可以使用静态或实例方法,这无关紧要),然后您将能够:
更新如何组织代码的示例.
从评论很清楚,信号不起作用,因为分析操作将根据用户请求运行.如果在保存特定模型时该操作应自动运行,则信号将非常有用.
我假设您知道如何使用django-rest-framework api视图或视图集,序列化器等.我不是那样的,更好地问另一个问题.这将是一个python解释比其他任何东西
在您的应用模块中,创建一个文件app_business_logic.py或任何您想要调用它的文件.例如,您可以将它放在models.py的同一级别,但这不是强制性的:
class HoldingsAnalyser:
# static method sample. Call it like this: "HoldingsAnalyser.run(..)"
@staticmethod
def run(holding_list):
# do your model generation here or whatever you need
return True # or whatever you need to return
# instance method sample. Create an instance first and then call the method:
# analyser = HoldingsAnalyser()
# analyser.run(...)
def run(self, holding_list):
# do your model generation here or whatever you need
return True # or whatever you need to return
Run Code Online (Sandbox Code Playgroud)
现在,在django-rest-framework api视图或视图集中,创建一个POST方法,当客户端app用户按下按钮(该按钮生成分析)时,将调用该方法:
from yourapp.app_business_logic import HoldingsAnalyser
class StockPortfolioViewSet(WhatEverMixingYouNeedToInheritFrom):
serializer_class = whatever # look at the docs
@detail_route(methods=['post'])
def run_analysis(self, request, pk):
stock_portfolio = get the object based on the pk
holdings = make your query to get the holdings
analysis_result = HoldingsAnalyser.run(holdings)
if analysis_result:
# everything ok
return Response(status=status.HTTP_204_NO_CONTENT)
else:
return Response(a useful error for your client)
Run Code Online (Sandbox Code Playgroud)
这个网址就像是http://server.com/api_path/stockportfolio/21/run_analysis/,其中21将是StockPortfolio的id
| 归档时间: |
|
| 查看次数: |
3437 次 |
| 最近记录: |