web-dev-qa-db-ja.com

Django Rest Framework Business Logic

Django Rest Frameworkを使用してバックエンドを作成しようとしていますが、ビジネスロジックを配置する場所を決定しようとしています。それはviews.pyに入れますか?オブジェクトのリストを取得したり、特定のオブジェクトを1つ取得したりするだけでなく、より複雑なサービスを作成したいと思います。どんなガイダンスでもありがたいです、ありがとう。一般的なDjangoプロジェクトのビジネスロジックについての議論があることを認識していますが、特にDjango残りのフレームワークについて質問しています。

20
perp

Django Rest Frameworkではなく、デザインパターンに関するものです。

ここにいくつかのヒントがあります:

  • RESTを使用してインターフェースを提供する場合、データ操作やビジネスロジックに関連する特定のコードを含めるべきではありません。
  • MVCアプローチを使用することは、アプリケーションを階層化するべきではないという意味ではありません。
  • UIにまったく触れずに、ビジネスロジックをテストできるはずです。
  • モデルにビジネスロジックを組み込むことを提案する人もいるかもしれません。しかし、Djangoモデルはドメインモデルや税計算などのビジネス関連のタスクとは異なるため、私はそれらに同意しません。
  • MVCで立ち往生する前に、 MVC 3層アーキテクチャに実装されたMVC について詳しく読むことができます。
  • ビジネスロジックをそこに配置するビジネスレイヤーと関連アプリを用意することをお勧めします。

MVC + three-tier diagram

オンラインのコーヒーショップがあり、コーヒーを注文するためのREST APIを提供したいとします。

これが私の提案されたコードサンプルです:

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
15
Saeed

これは、RestFrameworkでクエストを行うデザインパターンだと思います。これは、RestFramework上のAPIビルドでレイヤードアプローチを使用する方法の詳細な概要です。

メンテナンスを容易にするためにもう少し階層化されており、デザインパターンとGRASPプリンシパルを最も重要に利用しています。

レイヤードアプローチパッケージレベルビュー

enter image description here

さらなる分類:

enter image description hereenter image description here

レイヤーを通過する方法の例:

  1. Example.com/Customer/profile @ project/urls.pyにリクエストが送信されます enter image description here

  2. リクエストはそれぞれのURLのレイヤー(@ app/urls/Customer_Url)に転送されます The Request is forwarded to the Respective URL's Layer

  3. URLはそれをそれぞれのビューセットに渡します(@ app/Views/Customer_Viewsets/Customer_Signup.py) enter image description here

  4. これはポストリクエストであり(この例では想定しています)、ビジネスロジックレイヤー(@ app/BusinessLogicLayer/BLL.py)に転送されます enter image description here

  5. ビジネスロジック層には抽象実装(IBLLのインターフェイスとして機能)があり、要求をそれぞれのメソッドに転送して、すべてのビジネスルールをチェックします。 (@ app/BusinessLogicLayer/SUB_BLL/Customer/*) enter image description here

  6. 次に、要求はデータベースにユーザーのデータを格納するデータアクセス層に転送されます。などなど! (@ app/DataAccessLayer/DAL.py)

0
Syed Faizan

これは少し風変わりな方法かもしれませんが、メソッドを追加してロジックをシリアライザーにラップすることは非常に役立つと思います。

シリアライザー:

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.
0
Yanwar Sky