Django
Unmanagedモデルを使用しながらテストを適用する方法 (feat. Table XXXが存在しない)
以前、会社でRaw Queryで書かれていたレガシーコードをDjango ORMベースに改編しようとしているとお話ししたことがありましたよね? 以前に書いておいた悩みがある程度解決され、プロジェクト構造やファイルの整理方法も整ったので、実際にモデルを分類しながら起こった出来事を投稿しようと思います。 既存のSQLクエリを分析しながら、各テーブルがどのテーブルと結合されているか、影響度がどの程度かを確認しながらモデル分類まではうまくいっていたと思います。そしてそれがうまく動作するかテストをしようとテストコードを作成しているときに問題が発生しました。開発者にとっては~~嬉しい?~~エラーが発生したのです。 Table my_database.XXX doesn't exist. なんでテーブルがないの? Unmanagedモデルとは? Djangoでは、DBと接続するModelを定義する際にdjango.db.models.Modelモジュールを使用します。DjangoではModelを基にしてmigrationをサポートしているため、もしDjango Native Appで設計した場合、DjangoでDB Tableにアクセスして直接管理できるように設定することができます。 migrationについては次回に詳細に投稿しますね! このような場合、Djangoで定義したModelはデータベースに直接接続し設計図になります。 Djangoで管理されるDB SchemaはModelクラスでデフォルト設定されるのがmanaged = Trueです。実際のコードでは次のように適用されるでしょう。 class MyModel(models.Model): ... # DBフィールドを定義します ... class Meta: db_table = "real_database_table_name" manage = True # ここがポイントです。 Model内部MetaクラスはDjango Native Appを通じてモデルを定義する際にはわざわざ表記しなくてもDjango Modelでデフォルトで設定されているので、別途設定しなくても大丈夫です。
2022年4月20日
クラスビューでPUTを介してデータをパースする
リクエストに’データ’属性がない 会社で今回、関数型で設計されていたビューをクラスビューに再設計する際に発生した問題について見ていこうと思います。 Djangoを使っていると少し疑問に思う部分があります。特にREST Frameworkを通じてデータを受け取るときですが 私の場合はAttributeError: request has no attribute 'data'というエラーが発生しました。 まず、私が実装したクラスを見てみましょう。 # urls.py urlpatterns = [ path('my_url/', views.MyView.as_view()) ] # views.py class MyView(View) def put(self, request): my_data = request.data # my business logic もちろんJavaScriptでは myapp/my_url/に正しくデータを送っていましたが、request.dataという変数は生成されませんでした。
2022年4月12日