23.TIL (django - CRUD1)

dream.log·2021년 7월 20일
0

TIL

목록 보기
21/42
post-thumbnail

아직은 어렵지만, 장고의 CRUD에 대해 학습하고
실습해보는 시간을 가졌다!

CRUD를 하기 위해서는, ORM을 활용한다.
ORM이란, 명령을 내리고 객체를 연결하며 python과 - sql으로
서로 다른 언어를 번역해주는 역할을 한다.

Client로부터 상품 상세정보를 요청받고,
Web application server가 필요한 정보를 요청한다. database에!
(application server - database 사이에 장고가 있음)

  • request target :
    /login, /users/signup 등등의 주소들이 url.config에 정의되어 있음
    올바른 요청 확인하면 view로 보내줌

CRUD 과정에서는 ERD를 그려 models.py에 class를 활용해
내용을 입력하며, MySQL Database와 연결하여 해당 내용이 잘 구현되는지 확인한다.

models.py 작성이 끝난 후
manage.py가 있는 디렉토리에서 makemigration을 해주어야 하는데, models.py에 작성된 내용을 테이블로 만들기 위한 기초 작업이다.
이 작업을 완료한 후, migration을 한번 더 수행해 클래스에 짠 설계도를 데이터베이스로 이동을 시켜서 만들어준다!

1. Create : 생성

models.py 를 작성한 후 manage.py의 shell을 열어준다.
=> python manage.py shell
=> from products.models import Category, Product
from - import 형식을 활용해 models.py 에 작성해둔
class인 CategoryProduct를 불러온다.

=> 그 후 Objects 객체를 활용해 카테고리의 내용을 생성해준다.
Category.objects.create(name="음료") 의 방식으로
카테고리를 먼저 생성해준 후 (큰 틀이 되는 내용을 먼저 만든다!)
Product.objects.create(name="아이스 아메리카노", category_id = 1) 처럼
Product에 해당되는 내용을 만들어주고, category_id 값을 넣어 product와 category를 서로 연결해준다.

✔️ 유의사항!
null=True 가 정의되지 않은 컬럼에 값을 넣지 않고서는 create 불가하다.
charField 생성되었을 경우, 장고에서 값을 넣지 않아도 빈스트링 ‘ ’을 넣고 만들어버림.

2. Read : 조회

Create를 통해 만든 데이터를 읽어오는 작업이다.
입력한 데이터를 읽어 표로 반환하며, QuerySet의 데이터도 리스트로 쓰일 수 있음

get(), all(), filter(), exclude(), values(), values_list() 등의 다양한 Method들이 있다.

product = product.objects.get(id=1) => <Product: 아이스 아메리카노>

product.category => <Category : 커피>

product.category_id => 1
등등.. id=1의 값을 출력할 수 있다.

  • get(): 괄호 안에 값을 넣어 원하는 것을 출력하는데, 객체 자체만 출력! QuerySet에 감싸져 있지 않다!
    Product.objects.get(id=1)
    => <Product: 아이스 아메리카노>
    get method에서 name="아메리카노"로 출력을 시도하면, 오류 발생!
  • filter() : 객체가 Queryset안에 쌓여있고 여러값을 호출할 수 있다.
    Product.objects.filter(name='아메리카노') =>
    <QuerySet [<Product: 아메리카노>]>
    QuertSet 형태로 감싸진 값을 정상적으로 출력해준다 -

  • all() : 전체 값 출력 Method
    product.objects.all() : 전체의 값이 쿼리셋 안에 담겨 출력됨
    : <QuerySet [<Product: 아이스 아메리카노>, <Product: 프라푸치노>, <Product: 녹차 프라푸치노>]>
    product.objects.all()[1] => <product: 프라푸치노>
    product.objects.all()[1].name => 프라푸치노

  • exclude() : 특정 값 제외 출력 Method
    Product.objects.exclude(id=2) : 2번에 해당하는 프라푸치노 제외 출력 <QuerySet [<Product: 아이스 아메리카노>, <Product: 프라푸치노>, <Product: 녹차 프라푸치노>]>

  • value() : 전체 값을 출력하는데, value 값을 함께 출력해줌.
    all()과는 다른 차이가 있다!
    Product.objects.values() :
    <QuerySet [{'id': 1, 'category_id': 1, 'name': '아이스 아메리카노'}, {'id': 3, 'category_id': 1, 'name': '프라푸치노'}, {'id': 4, 'category_id': 1, 'name': '녹차 프라푸치노'}]>

  • Values_list() : value의 내용들을 list의 형태로 반환한다.
    [ (순서 , category_id, name)]
    Product.objects.values_list()
    => <QuerySet [(1, 1, '아이스 아메리카노'), (3, 1, '프라푸치노'), (4, 1, '녹차 프라푸치노')]>

get()과 filter()의 차이?

  • get : 객체 자체가 출력. 쿼리셋 없이 값이 나온다. user [ ] 데이터를 가져옴
    get methond는 한개만 출력이 됨. 두개 출력하면 오류남. 그래서 주로 id 값으로 많이 사용.

  • filter : 객체가 쿼리셋 안에 쌓여있음. 여러 값 호출 가능
    필터는 없는 값을 넣어도 빈 쿼리값을 반환해줌.객체 속성 접근 (.) 사용
    : user[1].id, (index의 형식으로 호출가능함)
    ex) user = user.objects.filter (쿼리셋형태)

    객체 속성에 접근하려면 객체 그 자체여야하고 쿼리셋에 감싸져있으면 안된다
    id를 치면 숫자로, 안치면 객체의 인스턴스 형태로 적어주어야 함

3. Update : 수정

filter로 수정 원하는 값을 불러와 update 할 수 있다.
(get은 사용 불가함_ 객체의 형태를 반환하면 오류가 발생하기 때문에.)
out값 1 : true 의미. 바꾸기 성공했다!

Product.objects.filter(id=2).update(name="아메리카노") => 1

4. Delete : 삭제

Out의 dictionary 형태로 몇개가 삭제되었는지 알려준다!
delete는 get,filter 모두 사용 가능하다.
Product.objects.filter(name='아메리카노').delete() =>
(1, {'products.Product': 1})

각각의 QuerySet을 능수능란하게 사용할 수 있게!
익숙해지자! 하이띵! ◕‿◕

profile
한 걸음, 한 걸음 포기하지 않고 발전하는 Backend-developer 👩🏻‍💻 노션 페이지를 통한 취업 준비 기록과 회고를 진행하고 있습니다. 계획과 기록의 힘을 믿고, 실천하고자 합니다.

0개의 댓글