๐Ÿ“

ORM, Django Shell, QuerySet

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ ์œ„์ฃผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ธ ๋‚ด์šฉ์€ Django์˜ QuerySet API reference๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

1. DATA

sample data๋ฅผ ๊ฐ€์ง€๊ณ  ์„ค๋ช…๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
from django.db import models class Notice(models.Model): title = models.CharField(max_length=100) likeCount = models.IntegerField() viewCount = models.IntegerField() contents = models.TextField() def __str__(self): return f'์ œ๋ชฉ : {self.title}, ์ข‹์•„์š” ์ˆ˜ : {self.likeCount}, ์กฐํšŒ์ˆ˜ : {self.viewCount}'
๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์—‘์…€๋กœ ์˜ฎ๊ฒจ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ data์ž…๋‹ˆ๋‹ค.
notion imagenotion image

2. ORM

ORM์ด๋ž€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ชจ๋ธ ํด๋ž˜์Šค์™€ DB์— ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์—ฐ๊ด€์ง€์–ด ์ฃผ๋Š” ๊ธฐ์ˆ ๋กœ ์šฐ๋ฆฌ๊ฐ€ DB๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•  ํ•„์š” ์—†์ด ๋ชจ๋ธ ํด๋ž˜์Šค์˜ python ๋ฌธ๋ฒ•์„ ํ†ตํ•ด์„œ DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
ย 
# python manage.py shell

2.1. ์กฐํšŒ

all, filter, exclude, get, count, first, last, exists(๋ฐ์ดํ„ฐ์˜ ์œ ๋ฌด, True, False๋กœ ๋ฐ˜ํ™˜), order_by(์ •๋ ฌ), reverse ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์ค‘๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด union, intersection, difference๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  1. all
    1. ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      >>> from main.models import Notice >>> Notice.objects.all() <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>, <Notic e: ์ œ๋ชฉ : test title 2, ์ข‹์•„์š” ์ˆ˜ : 2, ์กฐํšŒ์ˆ˜ : 4>, <Notice: ์ œ๋ชฉ : test ti tle 3, ์ข‹์•„์š” ์ˆ˜ : 3, ์กฐํšŒ์ˆ˜ : 6>, <Notice: ์ œ๋ชฉ : test title 4, ์ข‹์•„์š” ์ˆ˜ : 4, ์กฐํšŒ์ˆ˜ : 8>, <Notice: ์ œ๋ชฉ : test title 5, ์ข‹์•„์š” ์ˆ˜ : 5, ์กฐํšŒ์ˆ˜ : 10> ]> >>> Notice.objects.all().order_by('-pk') <QuerySet [<Notice: ์ œ๋ชฉ : test title 5, ์ข‹์•„์š” ์ˆ˜ : 5, ์กฐํšŒ์ˆ˜ : 10>, <Noti ce: ์ œ๋ชฉ : test title 4, ์ข‹์•„์š” ์ˆ˜ : 4, ์กฐํšŒ์ˆ˜ : 8>, <Notice: ์ œ๋ชฉ : test t itle 3, ์ข‹์•„์š” ์ˆ˜ : 3, ์กฐํšŒ์ˆ˜ : 6>, <Notice: ์ œ๋ชฉ : test title 2, ์ข‹์•„์š” ์ˆ˜ : 2, ์กฐํšŒ์ˆ˜ : 4>, <Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2> ]> >>> Notice.objects.all().count() 5
      ย 
  1. get ํŠน์ • ์š”์†Œ๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ์—๋Š” ์ ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    1. >>> q = Notice.objects.get(id=1) >>> q <Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2> >>> q = Notice.objects.get(pk=1) >>> q <Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2> >>> q.id 1 >>> q.title 'test title 1' >>> q.viewCount 2
  1. filter, exclude
    1. ์œ„ ๋งค์„œ๋“œ๋Š” ์ด์–ด ๋ถ™์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. filter().exclude().filter().exclude() ์ฒ˜๋Ÿผ์š”. filter๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , exclude๋Š” ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์ผ ๋•Œ์—๋Š” __(์–ธ๋”๋ฐ” 2๊ฐœ)๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜๋Š” contains(ํฌํ•จ), in(๋‹ค์ค‘ ์กฐ๊ฑด ํฌํ•จ), exact, iexact, gt(>), lt(<), gte(>=), lte(<=), startswith(์•ž์— ๋งค์นญ), endswith(๋’ค์— ๋งค์นญ), range(๋ฒ”์œ„), date, year, month, day, week, week_day, quarter, time, hour, minute, second, regex ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
      get์€ filter๋กœ๋„ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      >>> Notice.objects.filter(title='test') <QuerySet []> >>> Notice.objects.filter(title='test title 1') <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>]> >>> Notice.objects.filter(id=1) <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>]> >>> Notice.objects.filter(viewCount=4) <QuerySet [<Notice: ์ œ๋ชฉ : test title 2, ์ข‹์•„์š” ์ˆ˜ : 2, ์กฐํšŒ์ˆ˜ : 4>]> >>> Notice.objects.filter(title__contains='test') <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>, <Notic e: ์ œ๋ชฉ : test title 2, ์ข‹์•„์š” ์ˆ˜ : 2, ์กฐํšŒ์ˆ˜ : 4>, <Notice: ์ œ๋ชฉ : test ti tle 3, ์ข‹์•„์š” ์ˆ˜ : 3, ์กฐํšŒ์ˆ˜ : 6>, <Notice: ์ œ๋ชฉ : test title 4, ์ข‹์•„์š” ์ˆ˜ : 4, ์กฐํšŒ์ˆ˜ : 8>, <Notice: ์ œ๋ชฉ : test title 5, ์ข‹์•„์š” ์ˆ˜ : 5, ์กฐํšŒ์ˆ˜ : 10> ]>
      ์ข€ ๋” ์„ธ๋ถ€์ ์œผ๋กœ filter๋Š” ์•„๋ž˜ ๋ฌธ๋ฒ•์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
      >>> Notice.objects.filter(title='test title 1') <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>]> >>> Notice.objects.filter(likeCount__lt=3) <QuerySet [<Notice: ์ œ๋ชฉ : test title 1, ์ข‹์•„์š” ์ˆ˜ : 1, ์กฐํšŒ์ˆ˜ : 2>, <Notic e: ์ œ๋ชฉ : test title 2, ์ข‹์•„์š” ์ˆ˜ : 2, ์กฐํšŒ์ˆ˜ : 4>]> >>> Notice.objects.filter(likeCount__gt=3) <QuerySet [<Notice: ์ œ๋ชฉ : test title 4, ์ข‹์•„์š” ์ˆ˜ : 4, ์กฐํšŒ์ˆ˜ : 8>, <Notic e: ์ œ๋ชฉ : test title 5, ์ข‹์•„์š” ์ˆ˜ : 5, ์กฐํšŒ์ˆ˜ : 10>]> # Notice.objects.filter([ํ•„๋“œ๋ช…]=value) # Notice.objects.filter([ํ•„๋“œ๋ช…]__[์กฐ๊ฑด]=value)

2.2. ์ƒ์„ฑ

>>> q = Notice.objects.create(title='sample', likeCount=100, viewCount=100, contents='hello world') >>> q <Notice: ์ œ๋ชฉ : sample, ์ข‹์•„์š” ์ˆ˜ : 100, ์กฐํšŒ์ˆ˜ : 100> >>> q.save()

2.3. ์ˆ˜์ •

>>> q = Notice.objects.get(title='sample') >>> q.contents = "์ˆ˜์ •๋œ ๋ฌธํ•ญ" >>> q <Notice: ์ œ๋ชฉ : sample, ์ข‹์•„์š” ์ˆ˜ : 100, ์กฐํšŒ์ˆ˜ : 100> >>> q.contents '์ˆ˜์ •๋œ ๋ฌธํ•ญ' >>> q.save()
๐Ÿ’ก
์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ .save()๋ฅผ ํ•ด์ฃผ์–ด์•ผ DB์— ๋ฐ˜์˜์ด ๋ฉ๋‹ˆ๋‹ค.

2.4. ์‚ญ์ œ

>>> q = Notice.objects.get(pk=2) >>> q.delete() (1, {'main.Question': 1})
  • (1, {'main.Question': 1})
    • ์ด 1๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๊ณ , ๊ทธ ์ค‘ main.Notice ๋ชจ๋ธ์˜ ์š”์†Œ๊ฐ€ 1๊ฐœ ์‚ญ์ œ๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.