WASH_Korea 모델링[Django]

은경·2021년 11월 6일
1

첫 프로젝트로 LUSH 코리아 사이트를 선택하게 되었다.

모두가 처음이라 갈팡질팡 했지만 팀원들과 회의를 거쳐 첫 모델링을 완성했다.

ERD

python manage.py startapp 명령어로 사이트 구성을 4분할 하여
users, products, carts, wishes 총 4개의 app을 생성해주었다.

Models.py 작성🔍

/product/models.py


from django.db import models

class Category(models.Model):
    name        = models.CharField(max_length=40)
    image       = models.CharField(max_length=2000)
    description = models.CharField(max_length=100)

    class Meta:
        db_table = 'categories'

class SubCategory(models.Model):
    name        = models.CharField(max_length=40)
    image       = models.CharField(max_length=2000)
    description = models.CharField(max_length=100)
    category    = models.ForeignKey('Category',on_delete=models.PROTECT)
#새롭게 배운 ForeignKey필드의 on_delete속성중에 PROTECT를 적용해 보았다(지워지면 안되기 때문에)
    class Meta:
        db_table = 'sub_categories'

class Product(models.Model):
    name         = models.CharField(max_length=40)
    price        = models.DecimalField(max_digits=8, decimal_places=2)
    #달러같은 경우 소수점이 있을수도 있기 때문에 decimal필드를 사용했다.
    #max_digits속성은 소수점을 합한 자리수, decimal_places는 소수점의 자리수 이다 
    weight       = models.CharField(max_length=10)
    sub_name     = models.CharField(max_length=40)
    description  = models.TextField()
    sub_category = models.ForeignKey('SubCategory',on_delete=models.CASCADE)
    tags         = models.ManyToManyField('Tag', through='ProductTag')
    
    class Meta:
        db_table = 'products'

class Tag(models.Model):
    name = models.CharField(max_length=40)
    
    class Meta:
        db_table = 'tags'

class ProductTag(models.Model):
    product = models.ForeignKey('Product', on_delete=models.CASCADE)
    tag     = models.ForeignKey('Tag', on_delete=models.CASCADE)
   
    class Meta:
        db_table = 'products_tags'

class ProductImage(models.Model):
    url     = models.CharField(max_length=2000)
    product = models.ForeignKey('Product', on_delete=models.CASCADE)

    class Meta:
        db_table = 'product_images'

/carts/models.py

from django.db import models
 
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(default=1)

    class Meta:
        db_table = 'carts'

/wishes/models.py

from django.db import models
 
class Wish (models.Model):
    user    = models.ForeignKey('users.User', on_delete=models.CASCADE)
    product = models.ForeignKey('products.Product', on_delete=models.CASCADE)

    class Meta:
        db_table = 'wishes'

/users/models.py

from django.db import models

class User(models.Model):
    user_name  = models.CharField(max_length=40, unique=True, default="")
    password   = models.CharField(max_length=200)
    name       = models.CharField(max_length=40)
    nickname   = models.CharField(max_length=40, null=True)
    email      = models.CharField(max_length=100, unique=True)
    contact    = models.CharField(max_length=15)
    address    = models.CharField(max_length=100, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'users'

피드백 받은 것💡

  • unipue=True속성은 필요한 여러군데 줄것

  • 들여쓰기, = , : 정렬 등 반드시 오타를 한번더 확인하는 습관을 들여야 겠다.

  • Many To Many 필드 또는 related_name을 작성할때 복수형 단어로 지정해 주어야 직관적이다.

  • url은 charField의 max_length값을 2000이상으로 줄 것, 생각보다 길수도 있다.

  • 포린키를 지정할때 on_delete 속성중에 CASCAD만을 사용했었는데, 속성의 종류가 여러가지 이기 때문에 잘 생각해보고 적절하게 적용시켜 줄 것

on_delete 속성의 종류❗️

  1. CASCADE : 참조 값이 삭제되면 같이 삭제된다
    ex. 게시글이 삭제되면 댓글도 같이 삭제된다

  2. PROTECT : 참조 값이 삭제될 때 에러가 발생한다
    ex. 댓글이 있는 게시글은 삭제를 할 수 없다

  3. SET_NULL : 참조 값이 삭제되면 null 값으로 변경된다
    ex. 게시글이 삭제되면 댓글은 DB에 남는다

  4. SET_DEFAULT : 참조 값이 삭제되면 default 값으로 변경된다
    ex. 게시글이 삭제되면 댓글은 지정된 default 게시글로 자동 할당된다

  5. SET() : set()은 default와 비슷하지만 조금더 강력한 기능을 한다.

  6. DO_NOTHING : 참조 값이 삭제되도 아무 작업을 하지 않는다
    ex. 댓글은 존재하지 않는 게시글을 참조하고 있어서 참조무결성을 해칠 수 있다
profile
Back-end 개발자

0개의 댓글