아직은 어렵지만, 장고의 CRUD에 대해 학습하고
실습해보는 시간을 가졌다!
CRUD를 하기 위해서는, ORM을 활용한다.
ORM이란, 명령을 내리고 객체를 연결하며 python과 - sql으로
서로 다른 언어를 번역해주는 역할을 한다.
Client로부터 상품 상세정보를 요청받고,
Web application server가 필요한 정보를 요청한다. database에!
(application server - database 사이에 장고가 있음)
/login, /users/signup
등등의 주소들이 url.config에 정의되어 있음CRUD 과정에서는 ERD를 그려 models.py
에 class를 활용해
내용을 입력하며, MySQL Database와 연결하여 해당 내용이 잘 구현되는지 확인한다.
models.py
작성이 끝난 후
manage.py
가 있는 디렉토리에서 makemigration
을 해주어야 하는데, models.py
에 작성된 내용을 테이블로 만들기 위한 기초 작업이다.
이 작업을 완료한 후, migration
을 한번 더 수행해 클래스에 짠 설계도를 데이터베이스로 이동을 시켜서 만들어준다!
models.py
를 작성한 후 manage.py
의 shell을 열어준다.
=> python manage.py shell
=> from products.models import Category, Product
from - import 형식을 활용해 models.py
에 작성해둔
class인 Category
와Product
를 불러온다.
=> 그 후 Objects
객체를 활용해 카테고리의 내용을 생성해준다.
Category.objects.create(name="음료")
의 방식으로
카테고리를 먼저 생성해준 후 (큰 틀이 되는 내용을 먼저 만든다!)
Product.objects.create(name="아이스 아메리카노", category_id = 1)
처럼
Product에 해당되는 내용을 만들어주고, category_id
값을 넣어 product와 category를 서로 연결해준다.
✔️ 유의사항!
null=True
가 정의되지 않은 컬럼에 값을 넣지 않고서는 create 불가하다.
charField 생성되었을 경우, 장고에서 값을 넣지 않아도 빈스트링 ‘ ’을 넣고 만들어버림.
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: 아이스 아메리카노>
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를 치면 숫자로, 안치면 객체의 인스턴스 형태로 적어주어야 함
filter로 수정 원하는 값을 불러와 update 할 수 있다.
(get은 사용 불가함_ 객체의 형태를 반환하면 오류가 발생하기 때문에.)
out값 1 : true 의미. 바꾸기 성공했다!
Product.objects.filter(id=2).update(name="아메리카노")
=> 1
Out의 dictionary 형태로 몇개가 삭제되었는지 알려준다!
delete는 get
,filter
모두 사용 가능하다.
Product.objects.filter(name='아메리카노').delete()
=>
(1, {'products.Product': 1})
각각의 QuerySet을 능수능란하게 사용할 수 있게!
익숙해지자! 하이띵! ◕‿◕