Django CRUD (Create, Read, Update, Delete) ๋?๐
1. CRUD ์ ์
CRUD๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ๋ณธ์ ์ธ 4๊ฐ์ง ์์
์ ์๋ฏธํ๋ค.
Django์์๋ ORM (Object-Relational Mapping)์ ํ์ฉํ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ฉฐ CRUD ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
CRUD ๊ฐ๋ ์ ๋ฆฌ
์์ | ์ค๋ช | HTTP ๋ฉ์๋ | Django ORM ๋ฉ์๋ |
Create | ๋ฐ์ดํฐ ์์ฑ | `POST` | `Model.objects.create()` |
Read | ๋ฐ์ดํฐ ์กฐํ | `GET` | `Model.objects.all(), Model.objects.get()` |
Update | ๋ฐ์ดํฐ ์์ | `PUT`, `PATCH` | `Model.objects.filter().update(), save()` |
Delete | ๋ฐ์ดํฐ ์ญ์ | `DELETE` | `Model.objects.filter().delete(), delete()` |
2. Django์์ CRUD ๊ตฌํํ๊ธฐ
1) ๋ชจ๋ธ (Model) ์ ์ํ๊ธฐ
Django์ ORM์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ๋ชจ๋ธ์ ์ ์ํด์ผ ํ๋ค.
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255) # ์ ๋ชฉ
content = models.TextField() # ๋ด์ฉ
created_at = models.DateTimeField(auto_now_add=True) # ์์ฑ์ผ
updated_at = models.DateTimeField(auto_now=True) # ์์ ์ผ
def __str__(self):
return self.title
โ ์ด ๋ชจ๋ธ์ Post๋ผ๋ ๋ธ๋ก๊ทธ ๊ฒ์๊ธ์ ๋ํ๋ด๋ ํ ์ด๋ธ์
- `title`: ๋ฌธ์์ด ํ๋
- `content`: ๊ธด ํ ์คํธ ํ๋
- `created_at`: ์์ฑ๋ ์๊ฐ (์๋ ์ ์ฅ)
- `updated_at`: ์์ ๋ ์๊ฐ (์๋ ์ ์ฅ)
2) CREATE (๋ฐ์ดํฐ ์์ฑ)
๋ฐฉ๋ฒ 1: ORM์ ์ด์ฉํ ๊ฐ์ฒด ์์ฑ
post = Post.objects.create(title="์ฒซ ๋ฒ์งธ ๊ธ", content="Django ORM์ผ๋ก ๋ฐ์ดํฐ ์์ฑ")
print(post.id) # ์์ฑ๋ ๊ฐ์ฒด์ ID ์ถ๋ ฅ
๋ฐฉ๋ฒ 2: ๊ฐ์ฒด๋ฅผ ์์ฑ ํ `save()` ํธ์ถ
post = Post(title="๋ ๋ฒ์งธ ๊ธ", content="save() ๋ฉ์๋๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ์ ์ฅ")
post.save() # ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
๐ `create()`์ `save()` ์ฐจ์ด์
- `create()`: ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
- `save()`: ๊ฐ์ฒด๋ฅผ ์์ฑ ํ ์์ ๊ฐ๋ฅ, ๋ง์ง๋ง์ `save()` ํธ์ถํ์ฌ ์ ์ฅ
3) READ (๋ฐ์ดํฐ ์กฐํ)
๋ฐฉ๋ฒ 1: ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ (`all()`)
posts = Post.objects.all() # ๋ชจ๋ ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
for post in posts:
print(post.title)
๋ฐฉ๋ฒ 2: ํน์ ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์กฐํ (`filter()`)
posts = Post.objects.filter(title="์ฒซ ๋ฒ์งธ ๊ธ") # ํน์ ์ ๋ชฉ์ ๊ฐ์ง ๊ฒ์๊ธ ์กฐํ
๋ฐฉ๋ฒ 3: ๋จ์ผ ๊ฐ์ฒด ์กฐํ (`get()`)
post = Post.objects.get(id=1) # ID๊ฐ 1์ธ ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
print(post.title)
- `get()`์ ๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ ์ฌ๋ฌ ๊ฐ๊ฐ ๋์ค๋ฉด ์ค๋ฅ ๋ฐ์ → `filter()` ์ถ์ฒ
๋ฐฉ๋ฒ 4: ๋ฐ์ดํฐ ์ ๋ ฌ (`order_by()`)
posts = Post.objects.order_by('-created_at') # ์ต์ ์ ์ ๋ ฌ
๋ฐฉ๋ฒ 5: ํน์ ํ๋๋ง ๊ฐ์ ธ์ค๊ธฐ (`values()`, `values_list()`)
titles = Post.objects.values_list('title', flat=True) # ๋ชจ๋ ์ ๋ชฉ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐ
print(list(titles)) # ['์ฒซ ๋ฒ์งธ ๊ธ', '๋ ๋ฒ์งธ ๊ธ']
4) UPDATE (๋ฐ์ดํฐ ์์ )
๋ฐฉ๋ฒ 1: ํน์ ๊ฐ์ฒด ๊ฐ์ ธ์์ ์์
post = Post.objects.get(id=1)
post.title = "์์ ๋ ์ ๋ชฉ"
post.save() # ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅ
๋ฐฉ๋ฒ 2: `update()`๋ฅผ ์ฌ์ฉํ ์ผ๊ด ์ ๋ฐ์ดํธ
Post.objects.filter(id=1).update(title="์
๋ฐ์ดํธ๋ ์ ๋ชฉ")
- `update()`๋ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์!
5) DELETE (๋ฐ์ดํฐ ์ญ์ )
๋ฐฉ๋ฒ 1: ํน์ ๊ฐ์ฒด ๊ฐ์ ธ์์ ์ญ์
post = Post.objects.get(id=1)
post.delete() # ์ญ์
๋ฐฉ๋ฒ 2: `filter().delete()`๋ฅผ ์ฌ์ฉํ ์ผ๊ด ์ญ์
Post.objects.filter(title="์ฒซ ๋ฒ์งธ ๊ธ").delete() # ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ ์ญ์
๐ `delete()`๋ DB์์ ์์ ํ ์ญ์ ๋๋ฏ๋ก ์ฃผ์ํด์ผํจ
- ๋ง์ฝ ์ญ์ ๋์ ๋นํ์ฑํ๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด `is_deleted` ๊ฐ์ ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์
3. Django View์์ CRUD ์ฒ๋ฆฌ
Django์ Class-based View (CBV) ๋๋ Function-based View (FBV)๋ฅผ ์ฌ์ฉํ์ฌ CRUD๋ฅผ ๊ตฌํํ ์ ์๋ค.
Function-based View (FBV)๋ก CRUD ๊ตฌํ
from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
# 1. Read: ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
def post_list(request):
posts = Post.objects.all()
return render(request, 'post_list.html', {'posts': posts})
# 2. Create: ์ ๊ฒ์๊ธ ์์ฑ
def post_create(request):
if request.method == "POST":
title = request.POST['title']
content = request.POST['content']
Post.objects.create(title=title, content=content)
return redirect('post_list') # ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋
return render(request, 'post_form.html')
# 3. Update: ๊ฒ์๊ธ ์์
def post_update(request, post_id):
post = get_object_or_404(Post, id=post_id)
if request.method == "POST":
post.title = request.POST['title']
post.content = request.POST['content']
post.save()
return redirect('post_list')
return render(request, 'post_form.html', {'post': post})
# 4. Delete: ๊ฒ์๊ธ ์ญ์
def post_delete(request, post_id):
post = get_object_or_404(Post, id=post_id)
post.delete()
return redirect('post_list')
4. Django Admin์์ CRUD ๊ด๋ฆฌ
Django๋ ๊ธฐ๋ณธ์ ์ผ๋ก Admin ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ์ฌ, CRUD ์์ ์ ์ฝ๊ฒ ํ ์ ์๋ค.
Django Admin์ ๋ชจ๋ธ ๋ฑ๋กํ๊ธฐ
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'created_at') # ๋ฆฌ์คํธ์์ ๋ณด์ด๋ ํ๋
search_fields = ('title',) # ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ
- `http://127.0.0.1:8000/admin/`์์ CRUD ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํจ
CRUD ์ ๋ฆฌ ๐งน
์์ | Django ORM | HTTP Method | URL ์์ |
Create | `Model.objects.create()` | `POST` | `/posts/create/` |
Read | `Model.objects.all()`, `get()`, `filter()` | `GET` | `/posts/, /posts/1/` |
Update | `Model.objects.filter().update()`, `save()` | `PUT`, `PATCH` | `/posts/1/update/` |
Delete | `Model.objects.filter().delete()`, `delete()` | `DELETE` | `/posts/1/delete/` |
๋๋ ์ :
1. Django์์๋ ORM์ ํ์ฉํ์ฌ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก CRUD๋ฅผ ๊ตฌํํ ์ ์๋ค~
2. get(), filter(), create(), update(), delete() ๋ฑ์ ORM ๋ฉ์๋๋ฅผ ์ ํ์ฉํด์ผ ํ๋ค~
3. Django Admin๊ณผ Views๋ฅผ ํ์ฉํ๋ฉด ํธ๋ฆฌํ CRUD ๊ธฐ๋ฅ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค~
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250210] Django Admin ์ ๋ฆฌ~ (0) | 2025.02.10 |
---|---|
[250205] Postman?? (1) | 2025.02.05 |
[250204] URI ์ดํดํ๊ธฐ (0) | 2025.02.04 |
[250203] Serializer ์ ๋ฆฌ~ (0) | 2025.02.03 |
[250131] django DRF(Django Rest Framework)๋~ (0) | 2025.01.31 |