1.モデル
https://docs.djangoproject.com/ja/3.2/topics/db/models/
1.1 オブジェクトの取得
1)全件取得
MyModel.objects.all()
2)1件の取得
3)複雑な条件
以下で様々な条件が作れる。
集計して、さらにその条件で検索するような場合は、以下を参考。
1.2 リレーション
関係により、以下クラスでFieldを定義する。リレーションを定義された側のモデルでは、自動で小文字のモデル名でフィールドが作成されて利用できるようになる。
1)多対一 (many-to-one) 関係
class ForeignKey(to, on_delete, **options)
必須ではありませんが、ForeignKey フィールド名 (上記の例では manufacturer はモデル名を小文字にしたものをおすすめします。
Djangoドキュメント:モデル-リレーション
2)多対多 (many-to-many) 関係
class ManyToManyField(to, **options)
3)一対一 (one-to-one) 関係
class OneToOneField(to, on_delete, parent_link=False, **options)
オブジェクトのhasattrは、以下でやる。
hasattr(object, 'field_name')
https://docs.djangoproject.com/ja/3.1/topics/db/examples/one_to_one/#one-to-one-relationships
4)実装例
Examples of model relationship API
5)その他
・キーは、無指定の場合、モデル名+’_id’となる。違う定義の場合は、db_columnで指定する。
・逆側のリレーションを作りたくない場合は、「related_name=’+’」
https://docs.djangoproject.com/ja/3.1/ref/models/fields/#django.db.models.ForeignKey.related_name
2.独自のクエリ
1)カスタムSQLの操作
https://docs.djangoproject.com/en/3.1/topics/db/sql/#executing-custom-sql-directly
2)トランザクション制御
https://docs.djangoproject.com/ja/3.1/topics/db/transactions/
3)素の SQL 文の実行
https://docs.djangoproject.com/ja/3.1/topics/db/sql/#performing-raw-sql-queries
3.複合主キーの扱い
https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
複合主キーはサポートされていなくて、「primary_key=True」指定されているフィールドが無い場合は、「id」が主キーとして動作するので、従来システムのDBを使っている場合、モデルを使った更新、削除が、このままでは動作しない。テーブルにidフィールドを追加するか、独自のクエリで処理する必要がある。
3.Manager
3.1 カスタムマネージャーの作成
DB取得等のロジックをViewの中に色々書くのもいまいちなので、カスタムマネージャーを作成する。
(Django公式)マネージャーのカスタマイズ
上記の日本語版は、翻訳が微妙で間違った解釈になるところがあるので、英語版を読んだ方が良さそう。
(Django公式)Custom managers
拡張クラスにメソッドを定義、あるいはget_querysetを書き換える等をコーディングするなり、QuerySetを定義するなりする。以下に4パターンの方法が記載されている。
(Django公式ドキュメント)
①カスタムMangerにメソッド追加する方法
②カスタムMangerの初期クエリセットを変更する方法
Modifying a manager’s initial QuerySet
③QuerySetを拡張してメソッド追加する方法
Calling custom QuerySet methods from the manager
④QuerySetを複数拡張する場合に、Managerをクエリセットから定義できる方法
Creating a manager with QuerySet methods
上記から適切な方法で実装していく。