Django Rest Frameworkを使用してバックエンドを作成しようとしていますが、ビジネスロジックを配置する場所を決定しようとしています。それはviews.pyに入れますか?オブジェクトのリストを取得したり、特定のオブジェクトを1つ取得したりするだけでなく、より複雑なサービスを作成したいと思います。どんなガイダンスでもありがたいです、ありがとう。一般的なDjangoプロジェクトのビジネスロジックについての議論があることを認識していますが、特にDjango残りのフレームワークについて質問しています。
Django Rest Frameworkではなく、デザインパターンに関するものです。
ここにいくつかのヒントがあります:
オンラインのコーヒーショップがあり、コーヒーを注文するための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
これは、RestFrameworkでクエストを行うデザインパターンだと思います。これは、RestFramework上のAPIビルドでレイヤードアプローチを使用する方法の詳細な概要です。
メンテナンスを容易にするためにもう少し階層化されており、デザインパターンとGRASPプリンシパルを最も重要に利用しています。
レイヤードアプローチパッケージレベルビュー
さらなる分類:
レイヤーを通過する方法の例:
URLはそれをそれぞれのビューセットに渡します(@ app/Views/Customer_Viewsets/Customer_Signup.py)
これはポストリクエストであり(この例では想定しています)、ビジネスロジックレイヤー(@ app/BusinessLogicLayer/BLL.py)に転送されます
ビジネスロジック層には抽象実装(IBLLのインターフェイスとして機能)があり、要求をそれぞれのメソッドに転送して、すべてのビジネスルールをチェックします。 (@ app/BusinessLogicLayer/SUB_BLL/Customer/*)
次に、要求はデータベースにユーザーのデータを格納するデータアクセス層に転送されます。などなど! (@ app/DataAccessLayer/DAL.py)
これは少し風変わりな方法かもしれませんが、メソッドを追加してロジックをシリアライザーにラップすることは非常に役立つと思います。
例
シリアライザー:
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.