일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 장고초기세팅
- CORS
- manytomanyfield
- pm2
- crud2
- django westagram
- 트랜잭션
- 호이스팅
- 노드
- on_delete
- bcrypt
- typescript
- westagram
- status code
- javascript
- TypeError: this.boardRepository.createBoard is not a function
- 실행 컨텍스트
- Django
- OSI7계층
- 스코프
- 자바스크립트
- nodeJS
- async/await
- docker
- 프로미스
- node
- wecode
- JWT
- Jest
- rebase
- Today
- Total
될때까지
((TURTLE HOME)) 2일차 : products app, 상품 모델링 본문
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는 아래와 같다
자라홈의 구매하기는 장바구니에 담은 후에 결제가 가능하다. 즉 바로 구매하기 기능이 없다는 이야기!! 그래서 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를 작성해보자!! 아자아자!!
'프로젝트 > wecode1차 : TURTLE-HOME' 카테고리의 다른 글
((TURTLE HOME)) 6일차 : ProductListView 1/2 (0) | 2022.07.23 |
---|---|
((TURTLE HOME)) 5일차 : ProductDetailView (0) | 2022.07.22 |
((TURTLE HOME)) 4일차 : SubCategoryView (0) | 2022.07.22 |
((TURTLE HOME)) 3일차 : CSV파일 생성 및 DB에 적용하기 (0) | 2022.07.20 |
((TURTLE HOME)) 1일차 : 프로젝트 팀명 정하기, 파트 나누기, 초기세팅, ERD (0) | 2022.07.18 |