장고의 DB(데이터베이스)
from django.db import models
class Article(models.Model): -모델
title = models.CharField(max_length=50) -제목 최대 글자 50
content = models.TextField() - 게시글
이제 마이그레이션을 설치해보자
pythonmanage.pymakemigrations
그러면 마이그레이션 파일이 만들어짐!
pythonmanage.pymigrate
이것만 치면 오류가 나서 다시 코드를 써서 확정 시켜놓으면 된다
control + shift + p (맥은 command)를 눌러서 ‘SQLite: Open Database’ 선택
그러면 왼쪽밑에 SQLITE EXPLORER가 추가가 된다
(추가된 테이블을 확인가능)
테이블에 추가
created_at = models.DateTimeField(auto_now_add=True)-생성일/테이블
updated_at = models.DateTimeField(auto_now=True)-수정일/
이제 모델을 수정했으니 마이그레이션 생성
그러면 선택지가 2개 나오는데
기존에 생성한 데이터들은 어떻게 하겠냐고 묻습니다.
값하나를 주면 그 값을 다 넣는 방식
일단 종료하고 model로 돌아가서 기본값 설정하는 방식
1번을 선택하고 엔터를 누르면 추가가 된다
Django ORM
↓기본 형태라네요
MyModel.objects.all()
- Model Class . Manager . QuerysetAPI
장고 CRUD 랑 Shell
pythonmanage.pyshell - 장고 셀 진입 코드
그전에 설치할거 다 설치하고
pip install django-extensions -Django 기본 Shell보다 더 많은 기능이 있는 shell_plus를 제공
그리고 앱을 등록 해줘야함 settings.py에 가서 extensions등록!
pip install ipython -자동완성, 코드 색상 강조와 같은 기능
pip freeze > requirements.txt 저장하는 텍스트파일 만들고
설치후 django shell_plus
그러면 셸환경에 진입을 하였다!
Article.objects.all() -아티클 조회 (하지만 아무것도 안만들어서 없음)
article = Article(title='second_title', content='my_content') -모델 만들기!
article.save() - 저장
두번째 방법!
Article.objects.create(title='third title', content='') - 매니저(objects)한테 맡기기!
그러면 저장 안해도 됨!
모델 변경! -하고 db에 관련이 없어서 마이그레이션 만들고 반영 안해도 됨
class Article(models.Model):
title = models.CharField(max_length=50)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
Article.objects.all() 조회를 하면 위에 매직메소드에 적은것처럼 타이틀만나옴!
Article.objects.get(content='my_content') - 정확히 1개만 조회할때(2개 이상있을때 오류)
Article.objects.filter(content='my_content')- 조건에 맞는걸 조회(조건에 사용되는 매개변수를 lookup)
Article.objects.filter(id__gt=2) # 2보다 큰 id
Article.objects.filter(id__in=[1,2,3]) # 1,2,3에 속하는 id
Article.objects.filter(content__contains='my') # content에 'my'가 포함된
수정하기!
article = Article.objects.get(id=1)- 수정할 객체를 조회
article.title = 'updated title' - 수정할 내용을 입력
article.save() 수정한 것을 데이터베이스에 반영
삭제하기!
article = Article.objects.get(id=2) 삭제할 객체를 조회
article.delete() 삭제!
Django MTV 사용하기
아티클 앱하나 만들기
from .models import Artcle
...
def articles(request):
articles = Article.objects.all()
context = {
"articles": articles,
}
return render(request, "articles.html", context)
articles.html 변경
{% extends "base.html" %}
{% block content %}
<h1>Articles</h1>
<ul>
{% for article in articles %}
<li>
<div>글 번호 : {{ article.id }}</div>
<div>글 제목 : {{ article.title }}</div>
<div>글 내용 : {{ article.content }}</div>
<br>
</li>
{% endfor %}
</ul>
{% endblock content %}
새로운 글을 작성 하고싶다! 하지만 shell에서 하기엔 너무 귀찮으니 홈페이지에서 작성해서db로 옮겨보자구(form으로!)
from django.urls import path
from . import views
urlpatterns = [
path("", views.articles, name="articles"),
path("new/", views.new, name="new"),
path("create/", views.create, name="create"),
path("hello/", views.hello, name="hello"),
path("data-throw/", views.data_throw, name="throw"),
path("data-catch/", views.data_catch, name="catch"),
]
def new(request):
return render(request, "new.html")
articles의 templates에 new.html 만들기
{% extends "base.html" %}
{% block content %}
<h1>New Article</h1>
<form action="{% url 'create' %}" method="GET">
<label for="title">제목</label>
<input type="text" name="title" id="title"><br><br>
<label for="content">내용</label>
<textarea name="content" id="content" cols="30" rows="10"></textarea><br><br>
<button type="submit">저장</button>
</form>
{% endblock content %}
create view에서 데이터 넘겨받기
넘겨받은 데이터로 새로운 데이터 생성하기
- 받은 데이터로 새로운 데이터 생성
def create(request):
# GET 방식으로 전달된 데이터를 받아서
title = request.GET.get("title")
content = request.GET.get("content")
# 받은 데이터를 Article 모델을 이용해서 저장
article = Article(title=title, content=content)
article.save()
context = {
"article": article,
}
return render(request, "create.html", context)
GET을 POST로 바꾸기
html이랑 views에서 바꾸면 된다
{% extends "base.html" %}
{% block content %}
<h1>New Article</h1>
<form action="{% url 'create' %}" method="POST">
{% csrf_token %} POSt를 쓸꺼면 {% csrf_token %} 무조건 써야한다(이것만 넣어주면 됨)
<label for="title">제목</label>
<input type="text" name="title" id="title"><br><br>
<label for="content">내용</label>
<textarea name="content" id="content" cols="30" rows="10"></textarea><br><br>
<button type="submit">저장</button>
</form>
{% endblock content %}
views도 바꿔주고
...
def create(request):
# POST 방식으로 전달된 데이터를 받아서
title = request.POST.get("title") -GET을 POST로
content = request.POST.get("content")- -GET을 POST로
# 받은 데이터를 Article 모델을 이용해서 저장
article = Article(title=title, content=content)
article.save()
context = {
"article": article,
}
return render(request, "create.html", context)
...