[TIL] # 26 Django CRUD (1)


前回勉強したCreateに続きます.
Readを見に行きます

これは、今日学習するデータのユーザーに関する情報です.

READ


get()


User.objects.get(id = 1)
User.objects.get(id = 1).email
User.objects.get(id = 1).password
オブジェクトを返す方法
getをご利用いただくと会員様のメールまたはIDをお持ちいたします
ユニークな値の取得
オブジェクトを持っているので、必要な情報があります.使用(dot)
すぐ持って来ればいいです.

返されるオブジェクトが多い。


User.objects.get(id__gte = 1)
MultipleObjectsReturned
倉庫から直接誤りを放つ.😖

filter()


user1 = User.objects.filter(id = 1)
user1[0].email
user1[0].password
前に見たgetと何かに似ているところがあります.
異なる点がある場合、filterはクエリーセットを返します.
このクエリーセットでは、Pythonのリストと同様に動作します.
リストを使うように

filterとlistの違い


リストのappend、popなど、リストのように使用できます.
Listメソッドの可用性はその順序と似ている

上はクエリーセットのメソッド、下はlistのメソッドです

クエリー・セットでは、負の値は使用できません。



複数のクエリー・セット



jungs = User.objects.filter(email__startswith = "jung")
google_users = User.objects.filter(email__endswith = "jung")
クエリーセットを使用して情報を取得する場合
for文でインポートできます

exclude()


残りの除外項目をクエリーセットとしてインポート

フィルタと一緒に使用


users = User.objects.filter(email__endswith = "gmail.com").exclude(id =2)
このようにGoogleユーザーを使用するが、id=2のユーザーは含まれない.
残りを持ってきなさい.

exists()


メソッドが存在するかどうかを確認します.
True、Falseを返します

get_or_create()


持ってきて、存在しないなら、作って持ってきてください.
存在する場合はFalse、存在しない場合はTrue
get or createの場合tupleに戻ります

count()


テーブルに存在するクエリー、またはフィルタを使用してインポートされたクエリーセットの
戻り値
戻りint

first()


最初のオブジェクトを返す

last()


最後のオブジェクトを返します

aggregate()


ディクショナリ形式で返す
num emailはキー値に入り、「email」のすべてのユーザーの数は値に入ります.

どこで使いますか。


集約の場合は、集約関数を使用して集約値の数を求めるために使用します.
https://docs.djangoproject.com/en/3.1/topics/db/aggregation/

例題が悪いので,本のコラムに総ページ数があれば
本の総ページ数またはAvgを使ってすべての本の平均ページ数に対して、
あるいはfilterが持ってきた本の平均値などを利用して...取得用

values(), values_list()


valuesはdictionaryを含むクエリーセットを返します
valuesリストの場合、tupleフォーマットを返します.
各columnはkeyで、dataはvalue値で、バイナリ形式で表示されます


select_related


ForeignKeyの使用
# get을 이용해서 가지고 올경우 	
post1 = Post.object.get(id = 1)				# Hit
post1.user						# Hit
post1.user.email					# Hit
# select_related를 이용해서 가지고 올경우 
post2 = Post.objects.select_related('user').get(id = 1)	# Hit
post2.user
post2.user.email
# get을 이용한 쿼리문 
print(Post.objects.filter(id = 1).query)
>>> SELECT `posts`.`id`, `posts`.`content`, `posts`.`user_id`, `posts`.`created`, `posts`.`updated` FROM `posts` WHERE `posts`.`id` = 1
print(Post.objects.select_related('user').filter(id = 1).query)
# select_related를 이용한 쿼리문 
>> SELECT `posts`.`id`, `posts`.`content`, `posts`.`user_id`, `posts`.`created`, `posts`.`updated`, `users`.`id`, `users`.`email`, `users`.`password` FROM `posts` INNER JOIN `users` ON (`posts`.`user_id` = `users`.`id`) WHERE `posts`.`id` = 1
ForeignKeyを使用して参照する場合、
getの場合、データが必要になるたびにHit DBでデータを取得する
合計3つのデータベースHit
select relatedの場合はインポートされました.
データを1番Hitに持ち込む
ここでデータベースを非表示にすると、時間とメモリの損失を節約できます.
selectを使用してインポートする場合、select related
両者の順序は重要ではない.

ああ….つや消し