티스토리 뷰
앱/ models.py에 정의한다.
django.ab.models의 model 클래스를 상속한다.
blog/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=250)
body= models TextField()
settings.py에서 원래 db로 바꿔놓는다.
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
그리고 터미널에서도 mysite로 간다.
migration 작업
model을 DB에 반영하기 위해서, 파일을 만드는 작업
명령문
python manage.py makemigrations
python manage.py makemigrations 앱이름
해당 app만 migration을 만들고 싶으면 해당 앱이름만 넣으면 된다.
music에 대해서는 빼줄 것이므로 app에서 빼준다.
만들어진 migration 파일은 blog/migation에 들어간다.
# Generated by Django 4.2 on 2024-05-20 01:49
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="Post",
fields=[
(
"id",
models.BigAutoField(
auto_created=True, #db에 관련된 옵션
primary_key=True, #db에 관련된 옵션
serialize=False,
verbose_name="ID", #form에 관련된 옵션
),
),
("title", models.CharField(max_length=250)),
("body", models.TextField()),
],
),
]
내가 선언한 필드에서 primary key가 없을 경우, 자동으로 django에서 만들어준다.
레코드를 집어넣을 때마다 값이 자동으로 만들어져 있다.
primary key = 값이 중복안되고, 널 값 허용 x
sql을 사용할 때는 migration SQL을 확인한다.
python manage.py sqlmigrate 앱이름 마이그레이션파일명
python manage.py sqlmigrate blog 0001
이제 파일을 만들었으니, 진짜로 migrate를 진행한다.
python manage.py migrate
python manage.py migrate 앱이름
python manage.py migrate blog
이제 sqlite3를 열면 된다.
자동으로 만들어진 테이블 이름은 앱이름_모델명 소문자(여기서는 blog_post)가 된다.
테이블 이름을 바꿔주고 싶으면,
Class Meta:
managed = False
db_table = 'blog_test'
를, models.py에 있는 해당 Post Class 안에 넣으면 된다.
mysql 설정을 하고 싶다면, setting에서 engine만 mysql로 바꾸면 된다.
데이터 추가
테이블을 만들었으므로, 데이터를 추가할 수 있다.
장고 쉘로 들어간 후에, 데이터를 조회해본다.
python manage.py shell
from blog.models import Post
Post.objects.all()
Out[2]: <QuerySet []>
p1 = Post()로 하게 되면 하나의 인스턴스이다.
p2 = Post()가 되면 하나의 인스턴스를 더 추가하는 것이다.
Model을 세이브 하는 방법으로 추가
p1 = Post() #객체로 봤을 때는 인스턴스가 만들어졌지만, 하나의 인스턴스다.
p1.title = 'aaa'
p1.body = 'bbb'
p1.save()
혹은
p1 = Post(title=‘첫번째 데이터’, body=‘10000')
p1.save()
Manager에서 create() 하는 방법으로 추가
Post.objects.create(title='두번째 데이터', body='asfafa')
그 후에 Post.objects.all()로 추가해서 살펴본다.
데이터 수정
모델 인스턴스를 추출하고, 속성의 값을 바꾼다.
id가 1인 녀석을 뽑는다.
p3 = Post.objects.get(id=1)
p3.title
p3.body
p3.title = 'test'
p3.body = 'testest'
p3.save()
쿼리셋에 대해서 update할 수도 있다.
qs = Post.objects.filter(title='test')
qs.update(title='test', body='tete')
Delete
delete를 하려면 해당 데이터를 get해서 delete 하면 된다.
마찬가지로 여기도 쿼리셋을 할 수 있다.
p5 = Post.objects.get(title='test')
p5.delete()
qs = Post.objects.filter(title='test')
qs.delete()
admin 앱에서 데이터 조작
admin은 웹사이트 관리자가 웹 페이지에서 db를 관리할 수 있게끔 도와준다.
관리자 계정을 만드는 명령문을 사용해야 한다.
dev mysite>python manage.py migrate #먼저 적용
dev mysite> python manage.py createsuperuser
Username (leave blank to use 'purum'):admin
Email address:admin@mysite.com
Password:admin123
Password (again):admin123
The password is too similar to the username.
This password is too common.
Bypass password validation and create user anyway? [y/N]:
y
Superuser created successfully.
예시로 만드는 id이다.
실제로 할 때는 당연히 고쳐줘야 한다.
이제 서버를 띄운다.
python manage.py runserver
관리자 계정을 만들었으므로, admin 패턴은 이미 url에 등록이 되어 있다.
그래서 admin 페이지로 들어가면 된다.
이 페이지는 운영 중에 관리자로서 db를 관리할 때 들어가는 페이지이다.
blog/admin.py 파일을 연다. 그리고 아래를 추가한다.
from .models import Post #가져오려는 모델을 먼저 가져와서 import 해준다.
admin.site.register(Post) #
그리고 다시 브라우저로 와서 새로고침하면 추가된다.
이제 해당 모델을 클릭하면 수저알 수 있다.
우리가 준 정보는 모델의 정보밖에 없다.
앱에서 해당 정보를 기반으로 DB의 form을 만들어준 것이다.
이제 add post로 데이터 인스턴스를 추가할 수 있다.
모델 안에 str 메서드를 추가하면, 페이지에서 해당 title도 볼 수 있다.
class Post(models.Model):
def __str__(self):
return self.title
실습
view.py에서 해당 모델을 화면에 뿌릴 수 있도록 해줄 것이다.
blog/view.py
from .models import Post
def list(request):
post_list = Post.objects.all()
titles = ''
for post in post_list:
titles += post.title
return HttpResponse(titles)
view에 추가했다면 urls에도 추가해서, 해당 페이지로 들어갈 수 있게 한다.
blog/urls.py
from django.urls import path,include
from . import views
urlpatterns=[
path("test1/", views.test1),
path("test2/<id>/", views.test2),
path("test3/<year>/<mon>/<day>/", views.test3),
path("", views.list)
]
그러면 blog에서 들어가진다.
http://127.0.0.1:8000/blog/
veiw에서 id를 이용해서 path 변수를 활용하면 다음과 같이 사용할 수 있다.
blog/views.py
def detail(request, id):
post = Post.objects.get(id=id)
return HttpResponse(post.title)
blog/urls.py
urlpatterns = [
path('<int:id>/', views.detail),
]
데이터가 삭제/ 추가되었으므로, id가 밀려 있다.
그래서 try-except 문을 사용해서 보완해준다.
def detail(request, id):
try:
post = Post.objects.get(id=id)
except:
return HttpResponse('미존재 데이터')
return HttpResponse(post.title)
404로도 할 수 있다.
from django.http import HttpResponse, Http404
def detail(request, id):
try:
post = Post.objects.get(id=id)
except Post.DoesNotExist:
return Http404('미존재 데이터')
return HttpResponse(post.title)
from django.shortcuts import render, get_object_or_404
def detail(request, id):
post = get_object_or_404(Post,id=id)
return HttpResponse(post.title)