1차 프로젝트 🩺🍪 Dr.Tart - 모델링

Hailey Park·2021년 12월 5일
0

1차 프로젝트

목록 보기
1/6
post-thumbnail

1차 프로젝트가 시작되었다.
우리팀은 코스메틱 브랜드 Dr.Jart의 커머스 웹사이트를 디저트를 판매하는 커머스 웹사이트 Dr.Tart로 바꿔 클론코딩을 진행하기로 하였다.

백엔드 파트의 첫 미션은 ERD 모델링이었는데, 생각보다 장바구니와 오더의 관계성을 고려하는 것이 쉽지 않았다.

아래는 멘토님 ERD 모델링 리뷰 사항.

ERD 수정 사항 및 공부 해봤으면 하는 사항

  • 프로덕트 가격 : 확장성을 고려해서 국제적으로 볼 필요가 있음 → 소숫점 두자리까지 포함. 어떻게 해야 원하는 금액을 표현할 수 있는지 고민, DecimalField 자릿수표현 고민해보기, 왜 integer field나 float안쓰고 decimal을 쓸까?!
  • 프로젝트에 transaction 적용해보기 → 백엔드 진짜 중요하게 알아야하는 것 중 하나
  • 주문 끝나면 장바구니에서 Delete되는 방식으로 구현 하기
  • OderStatus 주문번호에서 제2 정규화 고민해보기 (UUID 찾아보기)
  • OrderStatus는 정규화하기 좋은 예 ( 테이블 분리하기 좋은 예) → order status가 정규화가 안되어있으면, 1000개 주문의 order status의 모든 row를 다 찾아서 바꿔줘야함 ( 영어로 바꿀 경우)
  • order number 쓸 때 유효아이디 쓰면 좋음 → 유효아이디가 뭔지 공부해보기
  • 카트에 있는 것을 오더에서 사용하고 카트에서 delete하는 방법과 카트랑 오더를 분리해서 하는 방법이 있는데 이번에는 전자의 방법을 사용할 것. 후자의 방법은 처음에는 헷갈릴 수 있다는 이유.

products/models.py

from django.db import models
from django.db.models.fields import URLField

from users.models  import User

class Menu(models.Model):
    name = models.CharField(max_length=20)
    
    class Meta:
        db_table='menu'

class Category(models.Model):
    name = models.CharField(max_length=50)
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
    
    class Meta:
        db_table='category'

class Product(models.Model):
    korean_name         = models.CharField(max_length=20)
    english_name        = models.CharField(max_length=20)
    thumbnail_image_url = models.URLField(max_length=200)
    price               = models.DecimalField(max_digits=10, decimal_places=2)
    created_at          = models.DateTimeField(auto_now_add=True)
    updated_at          = models.DateTimeField(auto_now=True)
    vegan_or_not        = models.BooleanField(default=False, null=False)
    sugar_level         = models.IntegerField(default=1)
    category            = models.ForeignKey(Category, on_delete=models.CASCADE)
    description         = models.CharField(max_length=1000)
    
    class Meta:
        db_table='products'
    
class Image(models.Model):
    url       = models.URLField(max_length=300)
    product   = models.ForeignKey(Product, on_delete=models.CASCADE)
    
    class Meta:
        db_table='images'
    
class Review(models.Model):
    user             = models.ForeignKey(User, on_delete=models.CASCADE)
    product          = models.ForeignKey(Product, on_delete=models.CASCADE)
    content          = models.CharField(max_length=200, null=True)
    review_image_url = URLField(max_length = 300, null=True)
    created_at       = models.DateTimeField(auto_now_add=True, null=True)
    updated_at       = models.DateTimeField(auto_now=True, null=True)
    
    class Meta:
        db_table='reviews'
    
class ReviewComment(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    review      = models.ForeignKey(Review, on_delete=models.CASCADE)
    content     = models.CharField(max_length=100, null=True)
    
    class Meta:
        db_table='review_comments'
    
class Like(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    product     = models.ForeignKey(Product, on_delete=models.CASCADE)
    
    class Meta:
        db_table='likes'
    

orders/models.py

from django.db import models

class Cart(models.Model):
    product      = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    user         = models.ForeignKey('users.User', on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=0)
    
    class Meta:
        db_table = 'carts'
        
class OrderStatus(models.Model):
    status = models.CharField(max_length=20)
    
    class Meta:
        db_table = 'order_status'
        
class Order(models.Model):
    user         = models.ForeignKey('users.User', on_delete=models.CASCADE)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)
    address      = models.CharField(max_length=100)
    order_status = models.ForeignKey('OrderStatus', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'orders'
        
class OrderItem(models.Model):
    order        = models.ForeignKey('Order', on_delete=models.CASCADE)
    product      = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=1)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)
    
    class Meta:
        db_table = 'order_items'

users/models.py

from django.db import models

class User(models.Model):
    name         = models.CharField(max_length=100)
    email        = models.CharField(max_length=250, unique=True)
    password     = models.CharField(max_length=300)
    address      = models.CharField(max_length=100)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)
    vegan_or_not = models.BooleanField(default=False)
    
    class Meta:
        db_table = 'users'
profile
I'm a deeply superficial person.

0개의 댓글