갑자기 누가 나를 찔렀다

갑자기 누가 나를 찔렀다

·

3 min read

장고의 DB(데이터베이스)

만든 파일 안에models.py

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)-수정일/

이제 모델을 수정했으니 마이그레이션 생성

pythonmanage.pymakemigrations

그러면 선택지가 2개 나오는데
기존에 생성한 데이터들은 어떻게 하겠냐고 묻습니다.

  1. 값하나를 주면 그 값을 다 넣는 방식

  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 사용하기

아티클 앱하나 만들기

articles의 views.py 변경

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으로!)

articles의 urls.py에 추가

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"),
]

articles의 views.py에 추가

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 %}
  1. create view에서 데이터 넘겨받기

  2. 넘겨받은 데이터로 새로운 데이터 생성하기

    • 받은 데이터로 새로운 데이터 생성
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)
...