[1차프로젝트] - 시작~모델링
1차 프로젝트
팀 발표
우리팀은 스파오라는 사이트를 클론하게 되었다.
프론트3, 백엔드3으로 구성되어 있으며 내가 PM이 되었다.
역할분담
회원가입 및 로그인
후기작성 및 댓글작성
상품
크게 3가지로 나뉘었으며, 상품 부분을 내가 맡게 되었다.
모델링
스파오라는 웹 사이트를 클론하는 게 정해진 뒤,
구현을 위해 데이터베이스 모델링을 하게 되었다.
AQUERYTOOL이 유료화가 되어 ERDCLOUD를 사용하여 만들게 되었다.
상품의 경우, 상품의 사이즈, 색상별로 다 나뉘어져 있는데
처음에는 그걸 한 번에 저장할 생각이었다.
하지만 멘토님이 대표상품 따로, 상세상품 따로 저장하라고 하는 게 좋을 것 같다고 하셔서
분리하게 되었다.
models.py
우리는 회원정보 / 상품 / 게시글 / 주문으로 구성된 4개의 app과
이력관리를 위한 TimeStampModel사용을 위해 core앱을 사용하기로 했다.
core/models.py
from django.db import models
class TimeStampedModel(models.Model) :
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(default=None, null=True)
deleted_at = models.DateTimeField(default=None, null=True)
class Meta :
abstract = True
Meta 클래스의 abstract에 대한 설명이 장고 공식문서에서는 아래와 같이 나와있다
This model will then not be used to create any database table. Instead, when it is used as a base class for other models
데이터베이스 테이블에 생성되지는 않으며, 다른 모델의 기본 클래스로
사용된다는 뜻이다.
우리가 일반적으로 models.Model을 상속받는데,
TimeStampModel이 이걸 상속받기 때문에,
다른 모델에서는 TimeStampModel을 상속받으면 되는 것이다.
users/models.py
from django.db import models
from core.models import TimeStampedModel
class Gender(TimeStampedModel) :
name = models.CharField(max_length=100)
class Meta :
db_table = "genders"
class User(TimeStampedModel) :
username = models.CharField(max_length=200)
password = models.CharField(max_length=200)
name = models.CharField(max_length=100)
email = models.CharField(max_length=200, unique=True)
mobile_number = models.IntegerField()
address1 = models.CharField(max_length=450)
address2 = models.CharField(max_length=450, null=True)
birthday = models.DateField()
gender = models.ForeignKey(Gender, on_delete=models.CASCADE, null=True)
class Meta :
db_table = "users"
사용자 정보에 대한 models.py이다.
성별의 경우 남자, Man, M, Male 등 다양하게 입력할 수 있기 때문에,
테이블을 따로 생성해주었다.
사용자의 일반 ID의 경우, 우리나라만 ID로 쓰고 다른 곳에서는
username을 쓴다고 하여, 우리도 그렇게 설정해주었다.
postings/models.py
from django.db import models
from users.models import User
from core.models import TimeStampedModel
from products.models import Product
class Posting(TimeStampedModel):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
title = models.CharField(max_length = 100)
content = models.TextField(null = True)
rating = models.IntegerField(null = True)
class Meta:
db_table = 'postings'
class Comment(TimeStampedModel):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
posting = models.ForeignKey(Posting, on_delete=models.CASCADE)
content = models.TextField(max_length=200)
class Meta:
db_table = 'comments'
게시글과 그에 대한 댓글에 대한 models.py이다.
글을 쓸 때, 어떤 사용자가 어떤 상품에 대해 글을 쓰는지 알아야하기 때문에
user와 product는 참조키로 사용하게 되었다.
댓글의 경우, 특정 게시물에 쓰는 것이므로 posting의 id를 참조하게 되었다.
order/models.py
from django.db import models
from core.models import TimeStampedModel
class Wishlist(TimeStampedModel) :
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.Product', on_delete=models.CASCADE)
class Meta :
db_table = 'wishlists'
class Basket(TimeStampedModel) :
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
product = models.ForeignKey('products.DetailedProduct', on_delete=models.CASCADE)
class Meta :
db_table = 'baskets'
홈페이지를 보니, 내가 사려고 할 때 사용하는 장바구니 기능과
단순히 상품에 흥미가 있다는 정보의 위시리스트가 있었다.
baskets는 장바구니, wishlist는 위시리스트이다.
단, 장바구니는 사이즈와 색상을 선택해야 하기 때문에 상세정보를 저장한 테이블을,
위시리스트는 상품 자체를 추가하는 것이기 때문에 일반 상품을 참조하도록 선택
products/models.py
from django.db import models
from core.models import TimeStampedModel
class Menu(TimeStampedModel) :
name = models.CharField(max_length = 20)
class Meta :
db_table = 'menus'
class Category(TimeStampedModel) :
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
name = models.CharField(max_length = 20)
class Meta :
db_table = 'categories'
class Product(TimeStampedModel) :
name = models.CharField(max_length =50)
price = models.IntegerField()
description = models.TextField()
quantity = models.IntegerField()
class Meta :
db_table = 'products'
class Color(TimeStampedModel) :
name = models.CharField(max_length=10)
class Meta :
db_table = 'colors'
class Size(TimeStampedModel) :
name = models.CharField(max_length=5)
class Meta :
db_table = 'sizes'
class Image(TimeStampedModel) :
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
posting = models.ForeignKey('postings.Posting', on_delete=models.CASCADE, null=True)
urls = models.CharField(max_length=700)
class Meta :
db_table = 'images'
class DetailedProduct(TimeStampedModel) :
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
color = models.ForeignKey(Color, on_delete=models.CASCADE)
size = models.ForeignKey(Size, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
class Meta :
db_table = 'detailed_products'
홈페이지를 보니, 메뉴-카테고리-상품 구조로 종속되어 있었다.
그래서 카테고리는 메뉴의 정보를, 상품은 메뉴와 카테고리 정보를 가지고 있어야 했다.
그리고 상품에서 색상과 사이즈를 선택해야 하기 때문에 Color, Size를 만들었다.
이미지의 경우, 상품과 게시글에 대해 추가하기 때문에 둘 중 하나를 참조할 수 있게
null=True를 설정했다.
그리고, 마지막의 DetailedProduct가 아까 말한 상품의 상세정보에 대한 테이블이다.
Author And Source
이 문제에 관하여([1차프로젝트] - 시작~모델링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kyleee/1차프로젝트-시작모델링저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)