[django]1st project 1~2일차

전예찬·2022년 4월 26일

1st project

목록 보기
1/4

대망의 1차프로젝트 시작..

1. 주제 선정

우리 팀은 배민문방구를 클론코딩 하기로 하였고,
판매 물품은 올림픽 관련 용품으로 선정 하였습니다.

2. 초기 세팅

프론드엔드와 백엔드는 본격적으로 프로젝트에 들어가기 앞서 각자 초기세팅을 진행 하였습니다.

3. ERD 작성

백엔드는 프로젝트에 필요한 데이터베이스에 들어가는 테이블들을 알기위해 ERD를 작성해 줍니다.

ERD는 위와 같이 만들어 주었습니다.
우리는 팀은 회원가입/로그인을 위한 유저정보테이블,상품을 분류하기 위한 카테고리 테이블과 상품등록을 위한 상품테이블,사이트 내 유저가 질문하고 답하는 Questions answers 테이블,쇼핑카트 기능을 하는 카트테이블, 주문상태를 나타내는 오더테이블 이렇게 구성 하였습니다.

위 ERM에 특이사항은 오더와 카트는 제품과 유저의 id를 받는 Many to many관계이다.

3. models.py 작성

이제 ERD도 작성해 줬으니 models.py를 작성해봅시다.
이제 기능별로 application을 만들어 줘서 각자 models.py에 작성을 해줄겁니다. 저는 categories 와 products를 products라는 app에 orders 와 car 와 users를 users라는 app에 마지막으로 questions와 answers를 같은 app에 작성을 할 것입니다.

먼저 products app에 models.py를 작성해 보겠습니다.

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=45)

    class Meta:
        db_table = 'categories'

class Product(models.Model):
    name             = models.CharField(max_length=45)
    price            = models.DecimalField(max_digits=10, decimal_places=2)
    thumnail_url     = models.CharField(max_length=500)
    detail           = models.CharField(max_length=10000)
    detail_image_url = models.CharField(max_length=500)
    created_at       = models.DateTimeField(auto_now_add=True)
    new_product      = models.BooleanField()           
    category         = models.ForeignKey(Category, on_delete=models.CASCADE)

    class Meta:
        db_table = 'products'

위와 같이 작성해 보았습니다.
위 코드에서 살펴 볼 것은 price의 IntegerField 대신에 DecimalField를 쓴 이유는 물론 원화만 사용할때 전혀문제 없지만 외국 돈의 단위에 경우 소수점도 쓰이기 때문에 다양한 경우의 수에 적용하기 위해 DecimalField를 사용하였습니다.
저희 팀은 제품이 신상품인지 아닌지 분류하기 위해
new_product를 BooleanField를 사용하여 신상품 여부를 알기 쉽게 하고자 하였습니다.
category는 위에 클래스 Category로 부터 id를 가져온것을 볼 수 있습니다.

users app의 models.py를 작성 해보겠습니다.

from django.db       import models

from products.models import Product

class User(models.Model):
    email        = models.CharField(max_length=100,unique=True)
    password     = models.CharField(max_length=100)
    name         = models.CharField(max_length=50)
    phone_number = models.CharField(max_length=50)
    birth_date   = models.CharField(max_length=10)
    address1     = models.CharField(max_length=50)
    address2     = models.CharField(max_length=50)
    created_at   = models.DateTimeField(auto_now_add=True)
    orders       = models.ManyToManyField(Product, through='Order',related_name='user_order')
    carts        = models.ManyToManyField(Product, through="Cart",related_name='user_carts')

    class Meta:
        db_table = 'users'

class Order(models.Model):
    user     = models.ForeignKey(User, on_delete=models.CASCADE)
    product  = models.ForeignKey(Product, on_delete=models.CASCADE)
    qunatity = models.IntegerField()
    price    = models.DecimalField(max_digits=10, decimal_places=2)
    status   = models.CharField(max_length=30)

    class Meta:
        db_table = 'orders'

class Cart(models.Model):
    user     = models.ForeignKey(User, on_delete=models.CASCADE)
    product  = models.ForeignKey(Product, on_delete=models.CASCADE)
    qunatity = models.IntegerField()
    price    = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        db_table = 'carts'

위에 코드에서 살펴 볼 것은
먼저 email을 아이디로 사용할 것인데 중복 가입이 되지 않게 unique=true 라는 옵션을 주었습니다.
그리고 이번 models.py에 핵심이라고 할수 있는 Many to many관계의 Order와 Cart입니다.
order부터 살펴 보자면 일단 user 와 product의 id을 가져 옵니다.
그리고 구매하고자 하는 물품의 갯수와 가격과 알기위해 qunatity와 price의 정보를 가져옵니다.그리고 현재 상품의 배송상태를 알려주기 위해 staus를 생성행 주었습니다.
cart또한 order처럼 정보를 가져오지만 배송상태를 알려줄 필요가 없기 때문에 status를 빼주었습니다.

마지막으로 question 과 answer를 작성 해주었습니다.

from django.db    import models

from users.models import User

class Question(models.Model):
    title      = models.CharField(max_length=50)
    detail     = models.CharField(max_length=300)
    created_at = models.DateTimeField(auto_now_add=True)
    user       = models.ForeignKey(User,on_delete=models.CASCADE)

    class Meta:
        db_table = 'questions'

class Answer(models.Model):
    writer     = models.CharField(max_length=30)
    detail     = models.CharField(max_length=1000)
    created_at = models.DateTimeField(auto_now_add=True)
    question   = models.ForeignKey(Question, on_delete=models.CASCADE)

    class Meta:
        db_table = 'answers'

QnA는 question 같은 경우는 글쓴이의 정보를 알기위해 유저 id를 가져오고 제목과 내용 생성 날짜를 받습니다.
answer의 경우 해당 question에 답글이 달려야 하므로 question의 id를 가져옵니다...

이렇게 models.py를 작성해 주었습니다.
이제 부족하거나 놓친 부분을 수정할 일만 남았습니다..

profile
이제 시작

0개의 댓글