๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Django

(N:1) Comments - Article Relationship

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 9.

Django Relationship fields (N:1) (Comments - Article)

Django Relationship fields ์ข…๋ฅ˜

  1. OneToOneField() - 1:1
  2. ForeignKey() - N:1
  3. ManyToManyField() - N:N

ForeignKey(to, on_delete, **options)

โœ” N:1 relationship์„ ๋‹ด๋‹นํ•˜๋Š” Django์˜ ๋ชจ๋ธ ํ•„๋“œ ํด๋ž˜์Šค
โœ” Django ๋ชจ๋ธ์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์™ธ๋ž˜ ํ‚ค ์†์„ฑ์„ ๋‹ด๋‹น
โœ” 2๊ฐœ์˜ ํ•„์ˆ˜ ์œ„์น˜ ์ธ์ž

  1. ์ฐธ์กฐํ•˜๋Š” model class
  2. on_delete์˜ต์…˜

on_delete

โœ” ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์กŒ์„ ๋•Œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€๋ฅผ ์ •์˜
โœ” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด์„œ ์ค‘์š”ํ•œ ์„ค์ •!
โœ” ์˜ต์…˜ ๊ฐ’

  • CASCADE: ๋ถ€๋ชจ ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ ๋์„ ๋•Œ ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋„ ์‚ญ์ œ
  • PROTECT, SET_NULL, SET_DEFAULT ...๋“ฑ ์—ฌ๋Ÿฌ ์˜ต์…˜ ์กด์žฌ

Comment ๋ชจ๋ธ

Comment Model ์ •์˜

image

โœ” ์™ธ๋ž˜ ํ‚ค ํ•„๋“œ๋Š” ForeignKey ํด๋ž˜์Šค ์ž‘์„ฑ ์œ„์น˜์™€ ๊ด€๊ณ„ ์—†์ด ํ•„๋“œ ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑ๋œ๋‹ค.
โœ” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์€ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋ธ ํด๋ž˜์Šค ์ด๋ฆ„์˜ ๋‹จ์ˆ˜ํ˜•(์†Œ๋ฌธ์ž)๋กœ ์ž‘์„ฑ ๊ถŒ์žฅ

Migration ๊ณผ์ • ์ง„ํ–‰

imageimage

โœ” ๋ณ€๋™ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ migration ์ง„ํ–‰
โœ” makemigrations -> migrate

image

โœ” '[์„ค์ •ํ•œ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„]_id'๋กœ ์™ธ๋ž˜ํ‚ค๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

๋Œ“๊ธ€ ์ƒ์„ฑํ•ด๋ณด๊ธฐ

0. shell_plus ์‹คํ–‰

image

1. ๊ทธ๋ƒฅ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด...

image
image

โœ” ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ž˜ํ‚ค ๊ฐ’์ด ์—†์–ด์„œ ์—๋Ÿฌ ๋ฐœ์ƒ (๋Œ“๊ธ€์„ ๋‹จ๋…์œผ๋กœ ์“ธ ์ˆ˜ ์—†์Œ)

2. Article์„ ๋จผ์ € ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น Article์— ๋Œ“๊ธ€์„ ์ƒ์„ฑ!

image
image

โœ” ์ •์ƒ์ ์œผ๋กœ ๋Œ“๊ธ€์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

(์ฐธ๊ณ ) ๋ฐ”๋กœ ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋ฉด..?

image

โœ” ๊ฐ€๋Šฅ์€ ํ•˜๋‚˜ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ด€์ ์—์„œ ๋ฐ”๋žŒ์งํ•œ ํ‘œ๊ธฐ๋ฒ•์€ ์•„๋‹˜

๋Œ“๊ธ€ ์†์„ฑ ํ™•์ธํ•˜๊ธฐ

image

๋‘๋ฒˆ์งธ ๋Œ“๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ

image

๊ด€๊ณ„ ๋ชจ๋ธ ์ฐธ์กฐ

Related manager

โœ” N:1 ํ˜น์€ M:N๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ๋งฅ
โœ” Django๋Š” ๋ชจ๋ธ ๊ฐ„ N:1 ํ˜น์€ M:N ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋˜๋ฉด ์—ญ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” manager ์ƒ์„ฑ

์—ญ์ฐธ์กฐ

โœ” ๋‚˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”(๋‚˜๋ฅผ ์™ธ๋ž˜ ํ‚ค๋กœ ์ง€์ •ํ•œ)์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ
โœ” ๋ณธ์ธ์ด ์™ธ๋ž˜ ํ‚ค๋กœ ์ฐธ์กฐ ์ค‘์ธ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ
โœ” N:1 ๊ด€๊ณ„์—์„œ๋Š” 1์ด N์„ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ

Django์˜ ๊ด€๊ณ„ ๋ชจ๋ธ ์ฐธ์กฐ

image

โœ” article.comment ํ˜•์‹์œผ๋กœ๋Š” ๋Œ“๊ธ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.(Article ํด๋ž˜์Šค ์ž์ฒด์—๋Š” ์–ด๋– ํ•œ ๊ด€๊ณ„๋„ ์ž‘์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์Œ)
โœ” Django๊ฐ€ ์—ญ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” comment_set manager๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด article.comment_set ํ˜•ํƒœ๋กœ ๋Œ“๊ธ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ” ๋‹จ์ˆœ ์ฐธ์กฐ(comment -> article)์—์„œ๋Š” comment.article ํ˜•ํƒœ๋กœ ๋ฐ”๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ

์˜ˆ์‹œ

image

โœ” article 1 ์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋Œ“๊ธ€ ์กฐํšŒ

image

โœ” ์œ„์™€ ๊ฐ™์ด ๋ชจ๋“  ๋Œ“๊ธ€๋“ค์„ comment ๋ณ€์ˆ˜์— ๋‹ด๊ณ  content๋ฅผ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค

admin site ๋“ฑ๋ก

image

โœ” admin site์—์„œ ๋Œ“๊ธ€์„ ํ™•์ธ/๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋“ฑ๋ก์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

Comment ๊ตฌํ˜„

Create

1. comment ์ž…๋ ฅ์„ ์œ„ํ•œ CommentForm ์ž‘์„ฑ

image

2. detail ํŽ˜์ด์ง€์— comment ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ

image

 

image

3. ๊ทธ๋Ÿฌ๋‚˜...

image


โœ” ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€์ด ๋ฐ”๋กœ ์ž‘์„ฑ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์™ธ๋ž˜ ํ‚ค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ์•„๋‹ˆ๋ผ view ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐ›์•„ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ €์žฅ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

4. ์™ธ๋ž˜ ํ‚ค ํ•„๋“œ ์ถœ๋ ฅ์—์„œ ์ œ์™ธํ•˜๊ธฐ

image

5. ์ถœ๋ ฅ์—์„œ ์ œ์™ธ๋œ ์™ธ๋ž˜ ํ‚ค ๋ฐ›์•„์˜ค๊ธฐ (variable routing)

image
image
image

6. ๊ทธ๋Ÿฌ๋‚˜...

image

โœ” NOT NULL ์—๋Ÿฌ ๋ฐœ์ƒ

7. save ๋ฉ”์„œ๋“œ์˜ commit ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด DB์— ์ €์žฅ๋˜๊ธฐ ์ „ article ๊ฐ์ฒด ์ €์žฅ

image

Read

1. ํŠน์ • article์— ์žˆ๋Š” ๋ชจ๋“  ๋Œ“๊ธ€์„ ๊ฐ€์ ธ์˜จ ํ›„ context์— ์ถ”๊ฐ€

image

2. ํ…œํ”Œ๋ฆฟ์—์„œ ๋Œ“๊ธ€ ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ

image

3. ์ •์ƒ์ ์œผ๋กœ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฐ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

image

Delete

1. url ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ

image

2. view ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ

image

โœ” ์‚ญ์ œ ์ดํ›„ redirectํ•˜๊ธฐ ์œ„ํ•ด์„œ article_pk ํ•„์š”!

3. ์‚ญ์ œ ๋ฒ„ํŠผ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ

image

๋Œ“๊ธ€ ์ˆ˜์ •์€...?

โœ” ํŽ˜์ด์ง€์˜ ์ผ๋ถ€ ๋‚ด์šฉ๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ JavaScript์˜ ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— ๋‹ค์‹œ ์ง„ํ–‰...!!

Comment ๊ด€๋ จ ์ถ”๊ฐ€ ์‚ฌํ•ญ

1. ๋Œ“๊ธ€ ๊ฐœ์ˆ˜ ์ถœ๋ ฅํ•˜๊ธฐ

  1. DTL filter - length ์‚ฌ์šฉ
    image
  2. Queryset API - count() ์‚ฌ์šฉ
    image

2. ๋Œ“๊ธ€์ด ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒด ์ปจํ…์ธ  ์ถœ๋ ฅํ•˜๊ธฐ

image

๋Œ“๊ธ€