Open10
Django DDD with Onion Architecture
DJangoはモデルが秩序なく利用されるため難しさを抱える
- from_domain, to_domain を、Modelにもたせるといい設計になりそう
from django.db import models
from fa_analysis.domains.analysis import Analysis as DomainAnalysis
from fa_analysis.domains.answer import FreeAnswer as DomainFreeAnswer
from fa_analysis.domains.token import Token as DomainToken
class Analysis(models.Model):
"""Domain層のAnalysisとマッピングされるDjangoモデル"""
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=256)
@classmethod
def from_domain(cls, obj: DomainAnalysis) -> "Analysis":
"""ドメインモデルからのファクトリメソッド"""
return cls(id=obj.id, name=obj.name)
def to_domain(self) -> DomainAnalysis:
"""Djangoモデルからドメインモデルに変換するメソッド"""
return DomainAnalysis(
id=self.id,
name=self.name,
answers=[a.to_domain() for a in FreeAnswer.objects.filter(analysis=self)],
)
TODO: from_domain (from_entity) 未実装
Repositoryパターンとは永続化を隠蔽するためのデザインパターン
Python + FastAPIでオニオンアーキテクチャ(簡易版)
test_get_prompt_by_cat_id.py — ai-cat-api [GitHub] — Visual Studio Code — GitHub
- AI実装あり
- オニオンアーキテクチャの説明がわかりやすい
- application層をusecase層という命名にするとわかりやすくなる
- コードは好みではない
- 型の名前が長くてちょっと分かりづらい
- ディレクトリの切り方・ファイルの分け方が好みではない
- testあり
RAKSULさん
【全2回】AWS Lambda x FastAPIによるPythonモダンAPI開発のすゝめ 2 - RAKSUL TechBlog
i_meaning_repository.py — aws-lambda-fastapi-onion-architecture-template [GitHub] — Visual Studio Code — GitHub
- 今回作成したmy repoにかなりにている実装
- DIが違うライブラリ
- schemaの置き方とかはかなり参考にした
- test若干
Python で学ぶ実践的なドメイン駆動設計とレイヤードアーキテクチャ / DDD and Onion Architecture in Python - Speaker Deck
README.ja_JP.md — dddpy [GitHub] — Visual Studio Code — GitHub
- DTOがDAOも兼ねている(DB(sqlalchemy)に依存しているのは違和感)
-
from_enitity
,to_entity
を参考にした - XXXアーキテクチャ = DDD ではないことを教えてくれた
- 設計が大事!先にインターフェースを決めて、実装はあと! <- 重要
- CQRSの話
- Command Query Reeponsibility Segregation
- 参照系(Query) と 更新系(Command)を分離しようねってこと
- つまり、fastapiでは、ReadModelとCreateModel, UpdateModelを別で定義しておこうねってことかな? <- 以前から実装済み
- UoWの話
- Unit of Works
- DBのトランザクションやろうねってこと
- testあり
- リポジトリはきれい
- だが、やはりDTOがsqlalchemyに依存(密結合)しているのが違和感
- exceptionsのエラーメッセージをdomainに記載している偉い例
Django REST frameworkで戦術的DDDを実装してみた
- DjangoによるCQRS
container.py — fastapi-clean-architecture [GitHub] — Visual Studio Code — GitHub
- DIで参考にした
- config(BaseSettings)も参考になる
- codeめっちゃきれい
- testあり