Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架业务逻辑_Python_Django_Django Rest Framework_Business Logic - Fatal编程技术网

Python Django Rest框架业务逻辑

Python Django Rest框架业务逻辑,python,django,django-rest-framework,business-logic,Python,Django,Django Rest Framework,Business Logic,我正在尝试使用Django Rest Framework创建一个后端,并试图确定将业务逻辑放在何处。它会进入views.py吗?我想创建比仅仅获取对象列表或获取一个特定对象更复杂的服务。任何指导都将不胜感激,谢谢。我意识到在一般Django项目中有一个关于业务逻辑的讨论,但我要问的是Django rest框架。更多的是关于设计模式,而不是Django rest框架 以下是一些提示: 使用REST提供接口不应涉及与数据操作或业务逻辑相关的任何特定代码 使用MVC方法并不意味着不应该分层应用程序

我正在尝试使用Django Rest Framework创建一个后端,并试图确定将业务逻辑放在何处。它会进入views.py吗?我想创建比仅仅获取对象列表或获取一个特定对象更复杂的服务。任何指导都将不胜感激,谢谢。我意识到在一般Django项目中有一个关于业务逻辑的讨论,但我要问的是Django rest框架。

更多的是关于设计模式,而不是Django rest框架

以下是一些提示:

  • 使用REST提供接口不应涉及与数据操作或业务逻辑相关的任何特定代码
  • 使用MVC方法并不意味着不应该分层应用程序
  • 您应该能够在根本不接触UI的情况下测试业务逻辑
  • 有些人可能会建议将业务逻辑放在模型中。但我不同意他们的观点,因为Django模型不同于域模型和业务相关任务,如税务计算
  • 在陷入MVC之前,您可以阅读更多关于
  • 我建议有一个业务层和相关的应用程序,把你的业务逻辑放在那里

假设您有一个在线咖啡店&您想提供一个restapi来订购咖啡

以下是我建议的代码示例:

myapp/views.py:

    def order(request, quantity=1):
        # Process the order by calling the mapped method
        order_id = CoffeeShopService.place_order(quantity)
        return HttpResponse({'order_id': order_id, mimetype='application/json')
myapp/services.py:

    class CoffeeShopService(object):
        @staticmethod
        def place_order(quantity):
           # do the business logic here
           return order_id

我想这是在Rest框架中进行的设计模式探索。下面是我如何在Rest框架上构建API中使用分层方法的详细概述

为了便于维护,它的层次更高一些,最重要的是利用设计模式和掌握原理

分层方法包级视图

进一步分类:

下面是我如何浏览图层的示例:

  • 向example.com/Customer/profile发出请求 @project/url.py

  • 请求被转发到相应URL的层(@app/URL/Customer\u URL)

  • URL将其传递给相应的视图集 (@app/Viewsets/Customer\u Viewsets/Customer\u Signup.py)

  • 它是一个Post请求(我假设在本例中是这样的)被转发到业务逻辑层 (@app/BusinessLogicLayer/BLL.py)

  • 业务逻辑层有一个抽象实现(充当IBLL的接口),它将请求转发给相应的方法以检查我的所有业务规则!(@app/BusinessLogicLayer/SUB_BLL/Customer/*)

  • 然后,请求被转发到数据访问层,该层将用户的数据存储在数据库中。等等(@app/DataAccessLayer/DAL.py)


  • 也许这是一种有点古怪的方式,但我认为通过在序列化程序中添加方法将逻辑封装到序列化程序中是非常有帮助的

    例如

    序列化程序:

    类OrderSerializer(serializers.ModelSerializer): 类元: 型号=订单 字段=( “id”, “总计”, “折扣”, ) def计算折扣(自身,无论参数为何): #计算折扣,如果你需要。。。然后把它还给我 def计算税(自身,无论参数为何): #如果您需要,请计算税额并返还 def计算总计(自身,无论参数为何): #如果您需要,请计算总金额并返回 def创建(自我验证的_数据): #你可以通过申请 #计算方法中的一些逻辑。 #也许可以添加一些上下文 #您在视图中作为参数发送。
    关于这一点已经有了很大的讨论:是的,我看了这一个,但希望特别询问django rest Framework中的位置。你能找到一个好的设计模式吗?谢谢你的洞察力。但我还有一个问题,那就是实施你的想法。我很难标准化我的异常处理。正如您所知,在DRF中,我们有
    ValidationError
    。在ViewSet中还有另一个例外,也就是在较低级别中,例如我们在模型中有很多例外类。问题是这些错误处理在API响应中具有不同的格式。DRF中的异常处理是一个不同的问题,这可以通过自定义异常处理实现。如果您搜索,您可以找到如何或您可以问一个单独的问题,我最近开始用
    Python
    Django
    编写代码,然后才开始用
    Java
    /
    Spring Boot
    编写代码。我非常同意你的观点,即拒绝在
    models.py中加入逻辑,这会使它更胖。在我看来,
    services
    模块是创建一些业务流程的最佳场所。我刚从
    springboot
    experience
    Customer\u Name是“”
    ——这是完全错误的。一般来说,代码有味道。你应该使用验证框架(例如棉花糖)。我基本上设置了一个空字符串来处理我的一些自定义内容,这个API由几十个设备交互!另外,这段代码是我的团队成员的工作,所以他最好证明它是正确的,我的主要目标是给出分层架构的概述。如果不是客户名称,我会使用:)@warvariuc如果您能在Architecture方面找出错误,我会非常感激,因为我自己更注重长期使用,所以我非常愿意修复Architecture方面的错误。最重要的是,非常感谢:)当使用驼峰大小写名称、重复的代码、错误的低级习惯用法时,很难判断体系结构。还有太多的信息和截图,而不是文字。依我看,我只看到了代码和解释,但没有对代码中使用的设计原则进行描述。@warvariuc目前,我正在学习的学生只有1年的软件工程课程,还有3年的时间:)。我支持自己直到这个水平:)并且