django | February 20, 2020
Starbucks 메뉴 modeling 하기
**Modeling 설계 한 것 django app에 models.py에 적용하기
# starbucks/models.py
from django.db import models
class MainCategory(models.Model):
name = models.CharField(max_length = 50)
class Meta:
db_table = 'maincategories'
class SubCategory(models.Model):
name = models.CharField(max_length = 50)
main_category = models.ForeignKey('MainCategory', on_delete=models.SET_NULL, null=True)
class Meta:
db_table = 'subcategories'
class Size(models.Model):
size = models.CharField(max_length = 50)
class Meta:
db_table = 'sizes'
class ProductSize(models.Model):
product = models.ForeignKey('Product', on_delete = models.SET_NULL, null = True)
size = models.ForeignKey('Size', on_delete = models.SET_NULL, null = True)
class Meta:
db_table = 'product_sizes'
class Product(models.Model):
main_category = models.ForeignKey('MainCategory', on_delete=models.SET_NULL, null=True)
sub_category = models.ForeignKey('SubCategory', on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length = 50)
description = models.CharField(max_length = 500, default='good!')
image = models.URLField(max_length = 500, default='image')
size = models.ManyToManyField('Size', through = 'ProductSize')
class Meta:
db_table = 'products'
ForeignKey('class')
이런 방식으로 quotation(”) 처리를 하면, class 순서상 아래에 있어도 찾아서 해준다. quotation marks를 안 붙이면 import 된 class나, 이것보다 위에 있는 class만 가져올 수 있다. 이건 선언적인 표현으로, 붙여놓으면 순서로 인한 문제는 신경쓰지 않아도 된다.models.py에서 table들을 만드는 것을 끝났다! (makemigrations, migrate 해주는 것 잊지 말고!)
실제 data가 아직 없으니 data를 직접 넣어보자.
product.models의 class들을 *로 다 import 했다.
근데 class가 20개 넘어갈 때나 쓰고, 웬만하면 지양하자. import *
가 좋은 것만은 아니다.
ClassName(name='a').save()
, ClassName.objects.create(name='a')
# python manage.py shell
from product.models import *
MainCategory(name='음료').save() #data 입력 방법 1
SubCategory.objects.create(name='콜드브루', main_category_id=1) #data 입력 방법 2
-main_category_id=1
의 형식으로 작성
-field로 값으로 바로 direct 적용한다.
-main_category=MatinCategory.objects.get(id=1)
의 형식으로 작성
-객체를 넣어주면 어짜피 foreignkey는 id 참조니까 장고가 알아서 해준다.
-MySQL에서는 이런 객체참조의 방식으로 data 넣는 것은 절대 못한다.
# 값을 바로 적용
SubCategory.objects.create(name='콜드브루', main_category_id=1)
# 객체참조
SubCategory.objects.create(name='콜드브루', main_category=MainCategory.objects.get(id=1))
-이런 식으로 하면 방금 만든 객체를 변수에 넣어서 객체참조로 넣을 수 있지!
a = Resume(name='b') #resume의 새 객체를 변수에 넣고.
a.save() #save 해서 만들어주고.
Career.objects.create(name='c', resume=a) #career의 새 객체를 resume 객체 참조로 생성
a = Resume.object.create(name='b') #resume의 새 객체를 만들어서 변수에 넣고.
Career.objects.create(name='c', resume=a) #career의 새 객체를 resume 객체 참조로 생성
-주의할 점! 변수에 넣을 때 save까지 하면 안 된다.
a = Resume(name='b').save() #이건 a에 남겨지지 않아! a에 return이 없어!
City.objects.values('store__subcity__name')
SubCity.objects.values('city__name')
City.objects.filter(id=16).values('store__name') # 만약에 city와 store에 관계가 없으면 안된다!
for i in Product.objects.all():
i.size=1
i.save()
ManyToManyField
는 입력하지 않았다.>>> product1 = Product.objects.get(id=1)
>>> product1
<Product: Product object (1)>
>>> product1.size.add(Size.objects.get(id=1),Size.objects.get(id=2))
>>> ProductAllergy.objects.values()
<QuerySet [{'id': 1, 'product_id': 1, 'size_id': 1}, {'id': 2, 'product_id': 1, 'size_id': 2}]>