关于python:Django Rest Framework业务逻辑

Django Rest Framework Business Logic

我正在尝试用django-rest框架创建一个后端,并尝试确定将业务逻辑放在哪里。会出现在视图中吗?我想创建更复杂的服务,而不仅仅是获取对象列表或获取一个特定的对象。感谢您的指导。我意识到在一个通用的Django项目中有一个关于业务逻辑的讨论,但是我特别询问有关Django REST框架的问题。


它更多的是设计模式,而不是Django REST框架。

以下是一些提示:

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

MVC + three-tier diagram

假设您有一个在线咖啡店,您希望为订购咖啡提供一个RESTAPI。

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

myapp/views.py版本:

1
2
3
4
    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/服务.py:

1
2
3
4
5
    class CoffeeShopService(object):
        @staticmethod
        def place_order(quantity):
           # do the business logic here
           return order_id


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

例如

序列化程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = (
            'id',
            'total',
            'discount',
        )

    def calculate_discount(self, whatever_params):
        # calculate discount if you need... and return it

    def calculate_tax(self, whatever_params):
        # calculate tax amount if you need...and return it

    def calculate_grand_total(self, whatever_params):
        # calculate grand total if you need and return it

    def create(self, validated_data):
        # You can make an order by applying
        # some logic in the calculation method.
        # Maybe by adding a bit of the context
        # you sent as parameters from view.


我想这是在REST框架中进行的一个设计模式查询。下面是我如何在我的基于REST的API构建框架中使用分层方法的详细概述!

为了便于维护,它有一点层次感,最重要的是利用设计模式和掌握原理!

分层方法包级别视图

氧化镁

进一步分类:

氧化镁氧化镁

下面是我如何通过层的一个例子:

  • 请求example.com/customer/profile@项目/urls.py氧化镁

  • 请求被转发到相应的URL层(@app/url s/customer_url)The Request is forwarded to the Respective URL's Layer

  • URL将其传递到各自的视图集(@app/viewsets/customeru viewsets/customeru signup.py)enter image description here

  • 它是一个POST请求(我假设在这个例子中)被转发到业务逻辑层(@app/businesslogiclayer/bll.py)氧化镁

  • 业务逻辑层有一个抽象的实现(充当IBLL的接口),它将请求转发到各自的方法,以检查我的所有业务规则!(@app/businesslogiclayer/sub_bll/customer/*)enter image description here

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