startproject wediya17 .
으로 함django-admin startproject wediya17 .
manage.py
가 있는 main directory에서 바로 wediya17파일 안의 settings.py 를 들어가고 싶으면 /로 이어주면 된다.!
vi wediya17/settings.py
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.urls import path
urlpatterns = [
]
python manage.py startapp products
# vi wediya17/settings.py
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'products'
]
mysql -u root -p
암호입력
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> create database wediya character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.01sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wediya |
+--------------------+
# vi wediya17/settings.py
#기존상태
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
#수정후
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.myslq',
'NAME': 'wediya',
'USER' : 'root',
'PASSWORD' : 내비밀번호입력함,
'HOST' : '127.0.0.1',
'PORT' : '3306',
}
}
python manage.py runserver
진짜 오타 조심 ㅋㅋㅋㅋㅋㅋ
contro+c 로 runerver 종료
class 생성 (=db의 table생성)
db관리는 models.py
!!
vi products/models.py
from django.db import models
# Create your models here.
class Menu(models.Model):
name = models.CharField(max_length=10)
class Meta:
db_table = 'menu'
class Category(models.Model):
name = models.CharField(max_length=20)
menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
class Meta:
db_table = 'categories'
class Drink(models.Model):
name = models.CharField(max_length=30)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
class Meta:
db_table = 'drinks'
만든 table
python manage.py makemigrations products
makemigrations 된것들 보여줌!
여기서 아직 아무것도 migrate 한게 없기 때문에 체크가 안되있고 만약 migrate 한게 있다면 그건 X 표시가 되어있을 것이다.
python manage.py migrate products
이후에 showmigrations으로 확인
캡쳐를 delete까지 하고나서 한거라 이후에 추가한 0002파일도 보임
mysql> show tables;
+-------------------+
| Tables_in_wediya |
+-------------------+
| categories |
| django_migrations |
| drinks |
| menu |
+-------------------+
4 rows in set
때문에 암만 models.py 에서 class 만들고 show tables; 해봤자 아무것도 안나온다 (내가 해봐서 더 알게 됨)
mysql> use wediya;
Database changed
mysql> show tables;
Empty set (0.01 sec)
mysql> SELECT * FROM products;
ERROR 1146 (42S02): Table 'wediya.products' doesn't exist
mysql> SELECT * FROM wediya;
ERROR 1146 (42S02): Table 'wediya.wediya' doesn't exist
# vi products/models.py
class Drink(models.Model):
name = models.CharField(max_length=30)
name_en = models.CharField(max_length=40, null="True")
category = models.ForeignKey('Category', on_delete=models.CASCADE)
class Meta:
db_table = 'drinks'
drinks table에 음료의 영어이름을 추가하기 위해 다음과 같이 name_en 속성을 추가!!
이때, null="True"를 안하고 그냥 makemigrations 했더니라고 뜨면서 Select an option 하라고 뜬다.
Select an option : 2
해서 2를 선택해 나온 후, 다시 models.py 들어가서 null="True"라고 해줬다.
(영어 이름이 없을 수도! 있기때문에 해도 상관없긴 함)
이후 migrate 까지 해줌
근데 여기서.... name_en이 category_id 보다 위에 있게 하고싶어서 models.py 에 순서를 저리 입력했는데 table에서는 그냥 밑에 뜬다ㅠㅠ 그리고 내가 null="True" 를 했기 때문에 Null 에 YEW 라고 뜸!
python manage.py shell
Python 3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
아직 아무런 object가 없기 때문에 django 에서 read 하려해도 안뜸.
>>> from products.models import Drink
>>> Drink.objects.all()
<QuerySet []>
먼저 가장 상위에 있을 menu부터 채웠다.
>>> from products.models import Drink
>>> Drink.objects.all()
<QuerySet []>
>>> from products.models import Menu
>>> Menu.objects.create(name='음료')
<Menu: Menu object (1)>
>>> Menu.objects.create(name='베이커리')
<Menu: Menu object (2)>
>>> Menu.objects.create(name='이디야 스낵')
<Menu: Menu object (3)>
>>> Menu.objects.create(name='MD')
<Menu: Menu object (4)>
>>> Menu.objects.create(name='비니스트')
<Menu: Menu object (5)>
>>> Menu.objects.create(name='원두')
<Menu: Menu object (6)>
이후 read 해봄
>>> Menu.objects.all()
<QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>, <Menu: Menu object (3)>, <Menu: Menu object (4)>, <Menu: Menu object (5)>, <Menu: Menu object (6)>]>
열심히 했다.. 근데 오타 있음!!! Update 로 수정하면될듯
categories table의 경우 카테고리 이름과 속하는 menu 두가지의 column이 있다. 여기서 카테고리 이름(name)은 CharField로 설정했기 때문에 그냥 맞는 이름을 문자열로 입력하면 되고, menu의 경우 class Menu의 pk를 FK로 받기 때문에 INT로 지정해 주었다
그리고 객체를 create 할때 이렇게 입력했다.
Category.objects.create(name='BEVERAGE', menu_id=1)
아... 영어이름 까먹었다... 이것도 update로 입력해줘야지....
영어이름 내용을 입력하지 않았는데도 에러가 나지 않은 이유는 내가 null="True"로 했기 때문이랄까?^ㅠ^....
수정할 것
대충 변수 ca1 로 지정해줌
>>> from products.models import Category
>>> ca1 = Category.objects.filter(id=1)
>>> ca1.update(name='COFFEE')
1
저 1은 그냥 제대로 수정되었을때 나오는 것인데 models.py에 저 내용을 문자열로 나오도록 설정해주면 내가 바꾼 내역이 나오긴 함.
노가다의 향연 💕우음~^____^
딱히 지워야 될 데이터는 없지만~ 왠지모르게 맘에안드는 눈꽃 초코빙수 삭제하자
>>> d=Drink.objects.filter(id=13)
>>> d.delete()
(1, {'products.Drink': 1})
최종 table 확인
many to many
로 연결하기