될때까지

((TURTLE HOME)) 2일차 : products app, 상품 모델링 본문

프로젝트/wecode1차 : TURTLE-HOME

((TURTLE HOME)) 2일차 : products app, 상품 모델링

랖니 2022. 7. 19. 08:19
728x90
from django.db import models

# 대카테고리
class LargeCategory(models.Model):
    name = models.CharField(max_length=50)
    
    class Meta:
        db_table = 'large_categories'

# 중카테고리
class MiddleCategory(models.Model): 
    name           = models.CharField(max_length=50)
    large_category = models.ForeignKey('LargeCategory', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'middle_categories'

# 소카테고리
class SmallCategory(models.Model):
    name            = models.CharField(max_length=50)
    middle_category = models.ForeignKey('MiddleCategory', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'small_categories'

# 사이즈
class Size(models.Model):
    name = models.CharField(max_length=20)
    
    class Meta:
        db_table = 'sizes'

# 상품
class Product(models.Model):
    name        = models.CharField(max_length=100)
    number      = models.CharField(max_length=100)
    price       = models.IntegerField() 
    description = models.TextField()
    image_url   = models.CharField(max_length=500)
    size        = models.ManyToManyField('Size', through='ProductsAndSizes')
    
    class Meta:
        db_table = 'products'
   
# 사이즈와 상품
class ProductsAndSizes(models.Model):
    size    = models.ForeignKey('Size', on_delete=models.CASCADE)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'products_and_sizes'

 

어제 작성했던 ERD를 기본으로 products app을 만들고 그 안에 상품과 카테고리 모델링을 작업해봤다.

  • 대카테고리, 중카테고리, 소카테고리는 작은 카테고리가 한 단계 위의 카테고리를 참조하면 관계 끝이라서 쉽게 끝났다.

다음으로 상품은 가격, 설명, 사이즈가 관건이였다. 

  • 가격은 일단 천단위 구분기호를 어떻게 반영할까, 매직메소드를 사용해야하나 아니면 구분자를 찍어주는 함수를 만들고 뷰마다 적용시켜야할까 궁금했다. 이 부분은 프론트에서 적용 가능한 부분이라 그래서 빼버리기!
  •  IntegeField or DecimalField 가격 관련 필드를 검색해보니 대부분 DecimalField를 사용하더라. 하지만 원화는 소수점 아래가 필요없다 생각되어서 IntegerField를 사용해 가격을 나타내게끔 작성했다.
  • 그리고 설명은 긴 텍스트가 들어오기 때문에 CharField가 아닌 TextField를 사용해 길이 제한을 느슨하게 만들었다.
  • 한가지 상품에는 여러가지 사이즈가 존재한다. 사이즈도 여러가지 상품에 대해 여러 사이즈가 존재한다.

다대다 관계는 ManyToManyField를 사용하면 쉽게 관계를 이용할 수 있다. through속성을 적지 않으면 장고는 자동으로 관계 테이블을 생성하고 그 테이블을 사용하게 되는데 아무래도 내가 만든 테이블이 아니다보니 관리에 어려움이 있을 수 있다. 그렇기 때문에 직접 만든 관계 테이블을 사용하는게 좋다고 배웠다. 이를 위해 중간 테이블을 생성했고, through속성을 사용해 연결해줬다.


내 힘으로 작성한 모델은 여기까지.. 두고보자 어떻게 변경되나 🤓


예 다는 아니지만 뒤집어졌구요 ^_^ ㅋㅋㅋㅋ 멘토님께서 order도 한번 그려보라 하셔서 비교적 쉽게 그렸는데 잘못생각했었다. 또르르.. order까지 구현했던 우리의 ERD는 아래와 같다

바울님과 같이 그린 ERD

자라홈의 구매하기는 장바구니에 담은 후에 결제가 가능하다. 즉 바로 구매하기 기능이 없다는 이야기!! 그래서 cart에 연결해서 그렸는데, 멘토님께 들은 설명으로는 페이지와 연관시키지말고 데이터 자체를 생각하여 ERD를 그려야한다 하셨다.

받았던 피드백은 아래와 같다.

1. users

  • name은 보통 korean_name, english_name / 아니면 first_name, last_name과 같이 나눠서 많이 받는다.
  • address도 시/구../우편번호 와 같이 데이터를 나눠서 입력받는다.

2. large_categories 와 small_categories

  • categories와 sub_categories로 주로 사용한다.
  • image_url은 urlfield가 존재하지만 실질적 데이터는 charfield로 처리되기에 charfield로 쓴다. urlfield는 유효성검사도 해준다고 한다.

3. products

  • price의 경우 정확성을 위해 integerfield말고 decimalfield를 사용한다. 
  • size의 경우 size테이블을 만들어서 빼줬으니 상품에 있는 사이즈의 컬럼은 삭제해야한다.

4. products_and_sizes

  • 테이블 이름은 보통 and를 빼고 사용한다.
  • 상품 옵션이나 컬러에 따라 가격이 달라지는 경우가 있다. 이럴 경우 테이블 이름을 products_options로 하나 생성하고 해당 테이블에 product_id, option_id, price를 작성하면 해당 옵션값에 따른 각 상품들의 가격을 저장할 수 있다.
  • option_id를 사용하기 위해 해당 옵션에 대한 테이블(예를 들면 color테이블, size테이블)도 작성해야한다.

5. carts

  • 생성일시, 업데이트 일시 추가할 것
  • product_id가 아닌 product_option_id를 넣으면 해당 옵션 상품의 가격이 바로 적용된다.

6. orders

  • ERD와 웹페이지는 별개로 생각해서 작성한다.
  • 상품 주문에는 결제완료,상품준비중,배송중,배송완료 등 다양한 상태가 존재한다. 이를 위해 order_status 테이블을 생성한다.
  • 해당 주문의 상태는 order테이블에 종속된다.
  • 하나의 주문에서 한가지 상품만 주문하지 않는다. 여러가지 상품을 주문하기 때문에 이를 위해 order_item 중간 테이블을 생성하여 관리한다. 또 어떤 상품은 배송중이고 어떤 상품은 배송준비중인 것 처럼 따로따로 움직일 수 있기 때문에 order_item을 사용해 이 데이터들을 독립적으로 관리하는 것이 좋다.

 

그렇게 최종적으로 완성된 ERD는 아래와 같다.

처음보다 많이 복잡해진 ERD...! 오늘 하루를 ERD만 그리는 데 하루를 다 썼다.. ㅜㅜ 하지만 지금도 order 부분이 확 와닿지 않아서 꼭 꼭 프로젝트 끝나고 나서 위 ERD를 다시 그려보며 복습하는 시간을 가져야겠다. 시간이 촉박해지는데 도대체 뭘 어떻게 해야할지 감이 잘 안잡혀서 걱정이 많다... 나할수있겠즤...!? 일단 우리팀은 order전까지 구현하기로 했다. ERD는 order까지 그려놨고, 이제 해당 기능별 app들을 생성하고  models.py를 작성해보자!! 아자아자!!

728x90