Django C.R.U.D (1) -2

Jeongyun Heo·2021년 1월 21일
0

django

목록 보기
3/4
post-thumbnail

표(table) 하나가 class 하나

makemigrations 실행하고 난 뒤,
각 앱 안에 migrations 라는 디렉터리 안에 명령어들이 전부 들어있음

여기서는 products 앱 안에 migrations 라는 디렉터리 안에 들어있음

cd products
products 디렉터리로 이동

ls

__init__.py  __pycache__  admin.py  apps.py  

migrations  models.py  tests.py  views.py

migrations 라는 디렉터리가 생김

cd migrations
migrations 디렉터리로 이동

ls
디렉터리 안에 뭐뭐 있는지 보기

0001_initial.py  __init__.py  __pycache__

makemigrations 해서 0001_initial.py 생김

vi 0001_initial.py
0001_initial.py 파일 들어가서 보면 업데이트 된 내용 들어 있음

..
products 디렉터리로 이동

vi models.py
models.py에서 price 속성 추가

class Product(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=1000)
    price = models.CharField(max_length=1000, null=True)  # price 추가

    class Meta:
        db_table = 'products'

..
manage.py가 있는 첫 번째 westarbucks17 디렉터리로 이동

python manage.py makemigrations products
price 속성 추가한 거 반영하기 위해 migration

Migrations for 'products':
  products/migrations/0002_product_price.py
    - Add field price to product

0002_product_price.py 파일 생김
0002_product_price.py 파일에는 오로지 price에 대한 내용만 있음(업데이트 된 내용만 들어있음)

python manage.py migrate products
migrate도 해주기

Operations to perform:
  Apply all migrations: products
Running migrations:
  Applying products.0002_product_price... OK

0002_product_price 파일 적용됨

cd products
products 디렉터리로 이동

cd migrations
migrations 디렉터리로 이동

ls
migrations 디렉터리에 있는 거 보기

0001_initial.py  0002_product_price.py  __init__.py  __pycache__

0002_product_price.py 파일 생긴 게 보임

vi 0002_product_price.py
price에 대한 내용만 들어있음
migrations.AddField 라고 써있음

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('products', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='product',
            name='price',
            field=models.CharField(max_length=1000, null=True),
        ),
    ]

..
..
manage.py 있는 위치로 이동하기

./manage.py shell
장고 쉘 실행

Python 3.7.9 (default, Aug 31 2020, 07:22:35)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from products.models import Product
products 패키지에 있는 models라는 모듈에서 Product 클래스를 import

>>> Product.objects.all()
Product 클래스 안에 있는 모든 객체(인스턴스/row)를 다 가져오는 명령어
row 하나가 인스턴스 하나
클래스에 있는 인스턴스 하나가 테이블에 있는 행(row) 하나

<QuerySet []>

빈 리스트 나옴

※ QuerySet: 장고에서 만든 클래스의 인스턴스. 객체들이 모여 있는 리스트.
리스트에서 사용할 수 있는 인덱싱, 슬라이싱, 반복문 사용 가능
단, 인덱싱 [-1]은 안 됨

이게 C.R.U.D 중에서 R(Read)에 해당하는 것

>>> Product.objects.create(name='볼펜', description='모나미에서 만든 펜', price='$1000')

>>> Product.objects.create(name='볼펜', description='모나미에서 만든 펜', price='$1000')
<Product: Product object (1)>

Product 클래스에 1번 객체가 생겼다고 뜸

mysql> show databases;
mysql에서 명령어 입력하기
데이터베이스 목록 보여줌

mysql> use westarbucks

mysql> use westarbucks
Database changed

mysql에서 명령어 입력하기
westarbucks 데이터베이스를 사용하겠다

mysql> show tables;
Empty set (0.00 sec)

mysql> SELECT * FROM products;
mysql에서 명령어 입력하기

mysql> SELECT * FROM products;
+----+--------+----------------------------+-------+
| id | name   | description                | price |
+----+--------+----------------------------+-------+
|  1 | 볼펜   | 모나미에서 만든 펜         | $1000 |
+----+--------+----------------------------+-------+
1 row in set (0.00 sec)

>>> Product.objects.create(name='컵', description='스타벅스에서 만든 컵', price='$1300')
장고 쉘에서 명령어 입력하기

>>> Product.objects.create(name='컵', description='스타벅스에서 만든 컵', price='$1300')
<Product: Product object (2)>

mysql> SELECT * FROM products;
mysql에서 명령어 입력하기

mysql> SELECT * FROM products;
+----+--------+-------------------------------+-------+
| id | name   | description                   | price |
+----+--------+-------------------------------+-------+
|  1 | 볼펜   | 모나미에서 만든 펜            | $1000 |
|  2 | 컵     | 스타벅스에서 만든 컵          | $1300 |
+----+--------+-------------------------------+-------+
2 rows in set (0.00 sec)

>>> Product.objects.create(name='텀블러', description='스타벅스에서 만든 텀블러', price='$1500')
장고 쉘에서 명령어 입력하기

>>> Product.objects.create(name='텀블러', description='스타벅스에서 만든 텀블러', price='$1500')
<Product: Product object (3)>

mysql> SELECT * FROM products;

mysql> SELECT * FROM products;
+----+-----------+-------------------------------------+-------+
| id | name      | description                         | price |
+----+-----------+-------------------------------------+-------+
|  1 | 볼펜      | 모나미에서 만든 펜                  | $1000 |
|  2 | 컵        | 스타벅스에서 만든 컵                | $1300 |
|  3 | 텀블러    | 스타벅스에서 만든 텀블러            | $1500 |
+----+-----------+-------------------------------------+-------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM products \G
맨 끝에 \G 입력하면 그냥 목록으로 볼 수 있음

mysql> SELECT * FROM products \G
*************************** 1. row ***************************
         id: 1
       name: 볼펜
description: 모나미에서 만든 펜
      price: $1000
*************************** 2. row ***************************
         id: 2
       name: 컵
description: 스타벅스에서 만든 컵
      price: $1300
*************************** 3. row ***************************
         id: 3
       name: 텀블러
description: 스타벅스에서 만든 텀블러
      price: $1500
3 rows in set (0.00 sec)

>>> Product.objects.all()
장고 쉘에서 입력

>>> Product.objects.all()
<QuerySet [<Product: Product object (1)>, <Product: Product object (2)>, <Product: Product object (3)>]>

※ QuerySet: 장고에서 만든 클래스의 인스턴스. 객체들이 모여 있는 리스트.
리스트에서 사용할 수 있는 인덱싱, 슬라이싱, 반복문 사용 가능
단, 인덱싱 [-1]은 안 됨

>>> Product.objects.get(id=1)
get으로 불러오면 객체로 반환함

>>> Product.objects.get(id=1)
<Product: Product object (1)>

>>> Product.objects.filter(id=1)
filter로 불러오면 QuerySet으로 반환함

>>> Product.objects.filter(id=1)
<QuerySet [<Product: Product object (1)>]>

>>> product1 = Product.objects.filter(id=1)
변수 생성

>>> product1
product1 확인해보기

>>> product1
<QuerySet [<Product: Product object (1)>]>

>>> product1[0].name
리스트(QuerySet)의 첫 번째 요소니까 [0] (파이썬은 0부터 시작)

>>> product1[0].name
'볼펜'

>>> product1.update(name='검정색볼펜')
name을 볼펜에서 검정색볼펜으로 변경

>>> product1.update(name='검정색볼펜')
1

>>> product1[0].name
name 잘 바뀌었는지 확인

>>> product1[0].name
'검정색볼펜'

>>> product1.delete()
product1 삭제

>>> product1.delete()
(1, {'products.Product': 1})

mysql> SELECT * FROM products;
삭제됐는지 확인하기

mysql> SELECT * FROM products;
+----+-----------+-------------------------------------+-------+
| id | name      | description                         | price |
+----+-----------+-------------------------------------+-------+
|  2 | 컵        | 스타벅스에서 만든 컵                | $1300 |
|  3 | 텀블러    | 스타벅스에서 만든 텀블러            | $1500 |
+----+-----------+-------------------------------------+-------+
2 rows in set (0.00 sec)

0개의 댓글