[django]1st project 3일차

전예찬·2022년 4월 27일

1st project

목록 보기
2/4

저희는 이전에 작성한 모델에 관한 피드백을 받아 수정 하였습니다...

오늘의 수정사항

  1. 기존에 users application에 있던 Order와Cart를 묶어 orders라는 application에 모델을 작성해 주었습니다.

  2. Order에 배송상태를 알려주기 위한 status는 따로 테이블을 만들어 줬습니다. 왜냐하면 'status를 문자열로 그냥 넣게되면 그 status가 나중에 바뀌었을경우 만약 1억건의 주문내역이 있다고 쳤을때 엄청나게 많은 UPDATE 요청이 발생합니다 하지만 status 테이블을 따로 정규화해두면 해당 테이블의 특정 row 데이터만 변경하면 돼서 유지보수에 좋습니다.' 이러한 이유때문에 분리 해줬습니다.

  3. product의 detail 필드는 기존 CharFiled에서 TextFiled로 변경 해줬습니다.
    왜냐하면 기존에 CharFiled에 할당된 글자수가 많았기 때문에 제한이 없는 TextFiled가 더 알맞기 때문입니다.

  4. birth_date는 기존에 CharFiled에서 날짜만 받기위해 DateFiled로 변경 해줬습니다.

  5. 데이터베이스에 migrate를 해줬습니다.

이제 코드로 살펴 봅시다~

아래코드가 기존 users에 있는 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'

아래가 수정한 models.py입니다.

from django.db       import models

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.DateField()    #CharField에서 DateField로 교체
    address1     = models.CharField(max_length=50)
    address2     = models.CharField(max_length=50)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)    #업데이트된 시간 추가
    orders       = models.ManyToManyField('products.Product', through="orders.Order", related_name='user_order')
    carts        = models.ManyToManyField('products.Product', through="orders.Cart", related_name='user_cart')
	#기존에 있던 Order & Cart 클래스는 'orders' 라는 applications으로 옮겨줬습니다. 
    class Meta:
        db_table = 'users'

이제 옮겨간 Order와 Cart가 있는 곳으로 가봅시다~

from django.db       import models

class Status(models.Model):    #Order에 있던 status는 독립하였습니다.
    status = models.CharField(max_length=30)

    class Meta:
        db_table = 'statuses'

class Order(models.Model):
    user     = models.ForeignKey('users.User', on_delete=models.CASCADE)
    product  = models.ForeignKey('products.Product', on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField()
    price    = models.DecimalField(max_digits=10, decimal_places=2)
    status   = models.ForeignKey(Status, on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'orders'

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

    class Meta:
        db_table = 'carts'

이제 products의 변경된 model을 살펴 봅시다.

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.TextField() #TextField로 변경
 detail_image_url = models.CharField(max_length=500)
 created_at       = models.DateTimeField(auto_now_add=True)
 updated_at       = models.DateTimeField(auto_now=True)
 is_new		      = models.BooleanField()              
 category         = models.ForeignKey(Category, on_delete=models.CASCADE)

 class Meta:
     db_table = 'products'

이제 제일 중요한 migrate할 차례입니다.

처음에는 그냥 한꺼번에 makemigration하고 migrate하려고 했으나 각종 오류에 막혔습니다.ㅜㅜ

나중에서야 방법을 알게 되었습니다.
먼저

from django.db       import models

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.DateField()    
 address1     = models.CharField(max_length=50)
 address2     = models.CharField(max_length=50)
 created_at   = models.DateTimeField(auto_now_add=True)
 updated_at   = models.DateTimeField(auto_now=True)    
# orders       = models.ManyToManyField('products.Product', through="orders.Order", related_name='user_order')
# carts        = models.ManyToManyField('products.Product', through="orders.Cart", related_name='user_cart')
	  
 class Meta:
     db_table = 'users'

위 코드에서 보는거와 같이 ManyToManyField를 주석을 해준 다음에
makemigration 과 migrate를 진행해 줍니다.
그다음 하나씩 주석을 풀어주고 makemigration 과 migrate를 진행해 줍니다.
그러면 오류없이 데이터 테이블이 잘생성된것을 볼수있습니다.

왜 이렇게 해야 되는 것인지?
한번에 migrate 하면 안되는 것인지?

차차 알아봅시다...

이상 오늘의 프로젝트 회고입니다~~

profile
이제 시작

0개의 댓글