첫 프로젝트로 LUSH 코리아 사이트를 선택하게 되었다.
모두가 처음이라 갈팡질팡 했지만 팀원들과 회의를 거쳐 첫 모델링을 완성했다.
python manage.py startapp 명령어로 사이트 구성을 4분할 하여
users, products, carts, wishes 총 4개의 app을 생성해주었다.
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=40)
image = models.CharField(max_length=2000)
description = models.CharField(max_length=100)
class Meta:
db_table = 'categories'
class SubCategory(models.Model):
name = models.CharField(max_length=40)
image = models.CharField(max_length=2000)
description = models.CharField(max_length=100)
category = models.ForeignKey('Category',on_delete=models.PROTECT)
#새롭게 배운 ForeignKey필드의 on_delete속성중에 PROTECT를 적용해 보았다(지워지면 안되기 때문에)
class Meta:
db_table = 'sub_categories'
class Product(models.Model):
name = models.CharField(max_length=40)
price = models.DecimalField(max_digits=8, decimal_places=2)
#달러같은 경우 소수점이 있을수도 있기 때문에 decimal필드를 사용했다.
#max_digits속성은 소수점을 합한 자리수, decimal_places는 소수점의 자리수 이다
weight = models.CharField(max_length=10)
sub_name = models.CharField(max_length=40)
description = models.TextField()
sub_category = models.ForeignKey('SubCategory',on_delete=models.CASCADE)
tags = models.ManyToManyField('Tag', through='ProductTag')
class Meta:
db_table = 'products'
class Tag(models.Model):
name = models.CharField(max_length=40)
class Meta:
db_table = 'tags'
class ProductTag(models.Model):
product = models.ForeignKey('Product', on_delete=models.CASCADE)
tag = models.ForeignKey('Tag', on_delete=models.CASCADE)
class Meta:
db_table = 'products_tags'
class ProductImage(models.Model):
url = models.CharField(max_length=2000)
product = models.ForeignKey('Product', on_delete=models.CASCADE)
class Meta:
db_table = 'product_images'
from django.db import models
class Cart (models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
class Meta:
db_table = 'carts'
from django.db import models
class Wish (models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
class Meta:
db_table = 'wishes'
from django.db import models
class User(models.Model):
user_name = models.CharField(max_length=40, unique=True, default="")
password = models.CharField(max_length=200)
name = models.CharField(max_length=40)
nickname = models.CharField(max_length=40, null=True)
email = models.CharField(max_length=100, unique=True)
contact = models.CharField(max_length=15)
address = models.CharField(max_length=100, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'users'
unipue=True속성은 필요한 여러군데 줄것
들여쓰기, = , : 정렬 등 반드시 오타를 한번더 확인하는 습관을 들여야 겠다.
Many To Many 필드 또는 related_name을 작성할때 복수형 단어로 지정해 주어야 직관적이다.
url은 charField의 max_length값을 2000이상으로 줄 것, 생각보다 길수도 있다.
포린키를 지정할때 on_delete 속성중에 CASCAD만을 사용했었는데, 속성의 종류가 여러가지 이기 때문에 잘 생각해보고 적절하게 적용시켜 줄 것
- CASCADE : 참조 값이 삭제되면 같이 삭제된다
ex. 게시글이 삭제되면 댓글도 같이 삭제된다
- PROTECT : 참조 값이 삭제될 때 에러가 발생한다
ex. 댓글이 있는 게시글은 삭제를 할 수 없다
- SET_NULL : 참조 값이 삭제되면 null 값으로 변경된다
ex. 게시글이 삭제되면 댓글은 DB에 남는다
- SET_DEFAULT : 참조 값이 삭제되면 default 값으로 변경된다
ex. 게시글이 삭제되면 댓글은 지정된 default 게시글로 자동 할당된다
- SET() : set()은 default와 비슷하지만 조금더 강력한 기능을 한다.
- DO_NOTHING : 참조 값이 삭제되도 아무 작업을 하지 않는다
ex. 댓글은 존재하지 않는 게시글을 참조하고 있어서 참조무결성을 해칠 수 있다