TIL 44. Django:QuerySetとORM,モデル
wecodeのdjango crudコースから学んだことを記録します.この文章はdjango公式ドキュメントをもとに書かれています.
QuerySet API
プロジェクトにデータベースがあります!各アプリケーションに異なるデータベースを接続してしまい、毎回データベース設定を変更する必要があります.1つのサーバがデータベースに接続されます.したがって、アプリケーションの数にかかわらず、プロジェクトごとに1つのデータベースしか接続できません. listとは何ですか? ForeignKeyを複数使用している場合を見てみたいです. Query Setは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
です.中間表をパラメータ値として入れればいいです.
思考と質問
for i in MyModel.objects.all():
print(i.my_attribute)
owners[0:len(owners)]
# [<Owner: 강형욱>, <Owner: 뚱이>, <Owner: 홍길동>, <Owner: john>]
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
です.中間表をパラメータ値として入れればいいです.
思考と質問
class Actor(models.Model):
blahblah
class Movie(models.Model):
actors = models.ManyToManyField(Actor)
repr
? Reference
この問題について(TIL 44. Django:QuerySetとORM,モデル), 我々は、より多くの情報をここで見つけました https://velog.io/@wonseok2877/TIL-44.-django-View와-다대다관계-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol