TIL 44. Django:QuerySetとORM,モデル


wecodeのdjango crudコースから学んだことを記録します.この文章はdjango公式ドキュメントをもとに書かれています.

QuerySet API


No database activity actually occurs until you do something to evaluate the queryset.
Query Set APIがない場合、djangoはデータベース内のデータを変更または読み込むことができません.

iteration


A QuerySet is iterable, and it executes its database query the first time you iterate over it.
for i in MyModel.objects.all():
	print(i.my_attribute)
QuerySetは直接リストとして扱うことはできないが,オプションであるため,重複文を用いて要素をいじることができる.

Slicing


a QuerySet can be sliced, using Python’s array-slicing syntax. Slicing an unevaluated QuerySet usually returns another unevaluated QuerySet, but Django will execute the database query if you use the “step” parameter of slice syntax, and will return a list.
Pythonの利点スライスはQuerySetでも使用できます.同様にリストを返します.
owners[0:len(owners)]
# [<Owner: 강형욱>, <Owner: 뚱이>, <Owner: 홍길동>, <Owner: john>]
滑走路の間隔を決めることもできます.
QuerySet Sleingの戻り値はリストです.

len関数


QuerySet slicingは-1のように負のインデックスを行うことはできません.したがって,最後尾のindexを知るにはlen関数を用いる.

カウント方法


SQL言語のcountはlenより速いので、長さを求めるだけならcount関数のほうがいいです.

repr


A QuerySet is evaluated when you call repr() on it. This is for convenience in the Python interactive interpreter, so you can immediately see your results when using the API interactively.

list

list関数を使用してQuerySetをリストタイプに変換できます.いつ使うかわからない

だからね。


Python QuerySetを処理するには、通常、dicknerの要素のように.構文を使用してアクセスする必要があります.

最初は「QuerySetをそのままリストかJSONにすればいいんじゃないですか?」と思った.しかし、このような方法はありません.モジュールがあるといっても、しばらくは触れません.
また,繰返し文はlist理解を用いてコードを迅速に記述することができる.

一対多関係実施


Foreign Key


別のテーブルを参照する関係を作成するには、django.models.ForeignKeyを使用します.

class MyModel(models.Model):
	parent = models.ForeignKey("Parent")
これによりデータベーステーブルにforiegn keyが作成されます.

正参照と逆参照


一対の多関係を主従関係とすると,主人側は逆参照を行い,一方から正参照を行う.正参照はchild.parent.name形態、逆参照はparent.child_set.name形態である._setが付いたインスタンス名は、djangoが自動的に作成したmanagerオブジェクトです.
managerとは、簡単に言えば、データベースの管理者として機能するORMに関連するオブジェクトです.

鄭参照のmanagerにはforward_many_to_one_managerの名前がある.

逆参照マネージャにはreverse_many_to_one_managerの名前があります.

related_name

related_nameパラメータにパラメータ値が与えられた場合、django内でその名前で逆参照できます.それ以外にも、1つからもう1つに複数のForeignKeyを設定する場合には、related_nameが必要です.
航空と地域が一対多の関係と考えれば、出発地、経由地、到着地に分けられる.では、1つのテーブルにForeignKeyを3つあげます.そうすると、航空会社が逆参照している間に問題が発生します.ForeignKeyが重なる!

多対多の関係を実現する


中間テーブルの作成



ikeaのモデリング時に作られた中間テーブル.各テーブルにはForeignKeyは必要ありませんが、中間テーブルでは各テーブルをForeignKeyに設定する必要があります.

ManyToManyField

ManyToManyFieldは、複数対の複数の関係を作成するフィールド名です.
class Actor(models.Model):
	blahblah

class Movie(models.Model):
    actors = models.ManyToManyField(Actor)
興味深いことに、一方だけで関係性を定義することができます.ここでは,Movieページのみで多対多の関係が定義されているが,実際には移行を行うと,互いの中間テーブルが生成される.これにより、他方は、model_setの形式で相対インスタンスを逆参照することができる.Movieの方はactorを参照してください

追加と削除


複数対の複数の関係の2つのインスタンスを相互に追加する場合は、manager.add(<상대 instance>)を使用します.
逆に、削除する場合はremoveを使用します.

相互参照




興味深いことに、双方にforward_many_to_many_managerの名前があります.ManyToManyFieldを呼び出すのはそのうちの1つだけで、両方とも正参照できます.

related_name

ForeignKeyと書くのと同じように、逆参照を行うときに_setの名前を付けるのではなく、私が設定した名前を使うことができます.

through


中間テーブルでは、多対多の関係だけでなく、他のカラムが必要な場合にも中間テーブルを作成します.
このときに使用されるパラメータはthroughです.中間表をパラメータ値として入れればいいです.

思考と質問

  • プロジェクトにデータベースがあります!各アプリケーションに異なるデータベースを接続してしまい、毎回データベース設定を変更する必要があります.1つのサーバがデータベースに接続されます.したがって、アプリケーションの数にかかわらず、プロジェクトごとに1つのデータベースしか接続できません.
  • repr ?
  • listとは何ですか?
  • ForeignKeyを複数使用している場合を見てみたいです.
  • Query SetはDjango開発において本当に重要なようです.