์์ฃผ ์ฌ์ฉ๋๋ ORM ๋ฌธ๋ฒ์ ๋ํด ์กฐ๊ธ ๋ ๋ํ ์ผํ๊ฒ ์์๋ด ์๋ค
ORM์ ์ฐ๋ ์ด์ ๋ DB์กฐ์์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(ํด๋์ค)์ฒ๋ผ ํ๊ธฐ ์ํด์ ์ ๋๋ค!!
๋ชจ๋ ๋ชจ๋ธ๋ง๋ค ํ์ค ํ์ด์ฌ ํด๋์ค์ ๋ฉ์๋์ธ str() ์ ์ ์ํ์ฌ ๊ฐ๊ฐ์ object๊ฐ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฌธ์์ด์ ๋ฐํ(return)ํ๋๋ก ํ๋ค.
class Article(models.Model):
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
import
ํด์ ๊ฐ์ ธ์ค๋๊ฒ ํ์ํฉ๋๋ค.from .models import Article
Article.objects.all()
>>> <QuerySet []>
article = Article()
: ํด๋์ค๋ก๋ถํฐ ์ธ์คํด์ค ์์ฑarticle.title
: ์ธ์คํด์ค๋ก ํด๋์ค ๋ณ์์ ์ ๊ทผํด ํด๋น ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ณ๊ฒฝarticle.save()
: ์ธ์คํด์ค๋ก ๋ฉ์๋๋ฅผ ํธ์ถ# Article(class)๋ก๋ถํฐ article(instance) ์์ฑ!
article = Article()
article
>>> <Article: Article object (None)>
article.title = 'first' # ์ธ์คํด์ค ๋ณ์(title)์ ๊ฐ์ ํ ๋น
article.content = 'django!' # ์ธ์คํด์ค ๋ณ์(content)์ ๊ฐ์ ํ ๋น
# save ๋ฅผ ํ๊ณ ํ์ธํ๋ฉด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค
article.save()
article
>>> <Article: Article object (1)>
Article.objects.all()
>>> <QuerySet [Article: Article object (1)]>
# ์ธ์คํด์ค์ธ article์ ํ์ฉํ์ฌ ๋ณ์์ ์ ๊ทผํด๋ณด์(์ ์ฅ๋๊ฑธ ํ์ธ)
article.title
>>> 'first'
article.content
>>> 'django!'
article.created_at
>>> datetime.datetime(2019, 8, 21, 2, 43, 56, 49345, tzinfo=<UTC>)
article = Article(title='second', content='django!!')
# ์์ง ์ ์ฅ์ด ์๋์ด ์์
article
>>> <Article: Article object (None)>
# save๋ฅผ ํด์ฃผ๋ฉด ์ ์ฅ์ด ๋๋ค.
article.save()
article
>>> <Article: Article object (2)>
Article.objects.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
์ธ๋ฒ์งธ ๋ฐฉ์
create()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ์
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ๋ ๋ก์ง์ด ํ๋ฒ์ ์คํ
์ผ๋ก ๊ฐ๋ฅArticle.objects.create(title='third', content='django!')
>>> <Article: Article object (3)>
QuerySet
returnArticle.objects.all()
>>> <QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>, <Article: Article object (4)>]>
DoesNotExist
์๋ฌ๊ฐ ๋์ค๊ณ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ์ MultipleObjectReturned
์ค๋ฅ๋ฅผ ๋์.article = Article.objects.get(pk=100)
>>> DoesNotExist: Article matching query does not exist.
Article.objects.get(content='django!')
>>> MultipleObjectsReturned: get() returned more than one Article -- it returned 2!
**filter()**
Article.objects.filter(content='django!')
>>> <QuerySet [<Article: first>, <Article: fourth>]>
Article.objects.filter(title='first')
>>> <QuerySet [<Article: first>]>
pk
lookup shortcut์ฐ๋ฆฌ๊ฐ .get(id=1)
ํํ ๋ฟ๋ง ์๋๋ผ .get(pk=1)
๋ก ์ฌ์ฉํ ์ ์๋ ์ด์ ๋(DB์๋ id๋ก ํ๋ ์ด๋ฆ์ด ์ง์ ๋จ์๋) .get(pk=1)
์ด.get(id__exact=1)
์ ๋์ผํ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
pk๋ id__exact
์ shortcut ์ด๋ค.
Blog.objects.get(id__exact=14) # Explicit form
Blog.objects.get(id=14) # __exact is implied
Blog.objects.get(pk=14) # pk implies id__exact
article.title = 'byebye'
: article ์ธ์คํด์ค ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ณ์์ ์ ๊ทผํ์ฌ ๊ธฐ์กด์ ๊ฐ์ byebye
๋ก ๋ณ๊ฒฝarticle.save()
: article ์ธ์คํด์ค๋ฅผ ํ์ฉํ์ฌ save()
๋ฉ์๋ ์คํ# UPDATE articles SET title='byebye' WHERE id=1;
article = Article.objects.get(pk=1)
article.title
>>> 'first'
# ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ์ฅ
article.title = 'byebye'
article.save()
# ์ ์์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธ
article.title
>>> 'byebye'
.delete()
๋ฉ์๋ ํธ์ถarticle = Article.objects.get(pk=1)
# ์ญ์
article.delete()
>>> (1, {'articles.Article': 1})
# ๋ค์ 1๋ฒ ๊ธ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ฉด ์๋ค๊ณ ๋์จ๋ค.
Article.objects.get(pk=1)
>>> DoesNotExist: Article matching query does not exist.