Django Restframework

DjangoのN+1問題はpytestで検知しよう

こんにちは!
デバイスソフトウエア開発部の米森です。 担当している案件で、Webアプリ開発にDjangoを使用しています。
 
DjangoはPythonの「batteries included」という思想を踏襲しており、「バッテリー同梱なので、セットアップ作業無しですぐに色々な便利機能が使える」という考えをモットーの1つとして掲げています。
 
Webアプリ開発に必要な機能がほとんど全て揃っているようなDjangoですが、中でもORMが非常に強力で、SQLを意識することなく高速にWebアプリケーションを構築できます。しかし、その強力な抽象化の裏側で「いつの間にか意図せぬクエリが発行されていた」という恐怖を味わったことがあるエンジニアは多いのではないでしょうか。
 
その代表例が「N+1問題」です。
 
テストデータが少ない開発環境では問題が顕在化することが少ないので、動作確認の目をすり抜け、リリースされてしまうこともあります。
 
select_relatedprefetch_relatedなどの回避策がDjangoから提供されていますが、これらが適切に使用されているかをコードレビューで確認するのには限界があります。
 
なので、今回はpytestを使ってN+1問題を機械的に検知する方法をご紹介します。 続きを読む

DRFのシリアライザとto_internal_value()

こんにちは!開発部の米森です! 現在のプロジェクトでDjango Restframework(以下DRF)を使用してWeb APIを実装しています。とても便利なフレームワークなので効率的に開発を進めることができるのですが、DRF固有の概念であるシリアライザーにハマってしまったので、そのあたりの情報共有をさせてください! 続きを読む