質問: 開発環境 ----- * Django==2.0.3 * djangorestframework==3.7.7 背景 --- Django REST frameworkを用いてAPIサーバを立て、それを叩くことでデータベースの更新を行いたい。 質問したいこと -------- Django REST frameworkを使用していくつかのAPIを作成しました。Djangoを使用した場合、modelと1対1の関係でテーブルを作成することになると思います。Django REST frameworkを使用してAPIを作成した場合も同様に、APIとmodelが1対1の関係になり、1つのAPIで、1つのテーブルの更新しか出来ないと思います。 今回、APIを叩くと、任意のビジネスロジックが走る、もしくは任意の複数のテーブルの更新を行えるようにしたいです。理由として、例えば、マスタデータの更新と、それに関するログの更新を行いたいなどの場合には、複数のテーブルをまたいだ更新が必要だからです。 RDBMSのトランザクションを用いて複数のテーブルを同時に更新したい場合、どのような実装をするのが望ましいのでしょうか? API設計や、Djangoなどに知見のある方がいらっしゃいましたら、よろしくお願いいたします。
回答: > > 1つのAPIで、1つのテーブルの更新しか出来ないと思います。 > > > Django や restframework の generic viewのサンプルを見てそう思われたのだと思いますが 決して1つのviewやapiで1つのモデルしか更新できないわけでないです。 例えば `Hoge` モデルを作成するAPIをrestframeworkで作ったとして、同時に `PiyoLog` モデルも作成したければ、`peform_create` メソッド を override することで実現できます。 ``` class CreateHogeAPIView(generics.CreateAPIView): serializer_class = HogeSerializer def perform_create(self, request): serializer.save(user=request.user) # Hogeモデルが作成される # 別のモデルを同時に作成する PiyoLog.objects.create(user=request.user) ``` 公式のドキュメントが参考になると思います。 これとは別にトランザクションについては、Djangoのドキュメントが参考になると思います。 追記 > > ItemStockのstockが更新されたとき、ItemStockLogの`before_stock`と`after_stock`の値の更新も行いたいと考えています。 > > > コメントをもらったので追記します。上記内容を実現したいのであれば、signalを利用して、 * モデルが更新される前のstockデータをどこかに保存しておく -> pre_save * モデルが更新されたら、更新後のstockと一緒に ItemStockLogを作成する -> post_save みたいなことをするのが一番よさそうに思えました。 signalに関しては、公式のドキュメントが参考になります。