[Django] 데이터 모델링

^_^·2022년 7월 31일
0
post-thumbnail

모델링

장고의 모델을 작성하기전 테이블 관계를 미리 그려보고 모델을 작성해야한다.
아래는 커피원두 판매 사이트 클론 프로젝트에 사용한 데이이터 모델링 관계도이다.
모델링이 아직 익숙치 않아 수정을 여러번 해야했다. 어떻게 하면 데이터를 효과적으로 관리할 수 있을지 공부를 해야겠다.

모델링

실제 사이트의 모델링은 더욱 복잡하지만 짧은 기간 연습으로 만드는 사이트이기 때문에 필수와 추가 기능을 나누어 진행했다. 필수기능은 로그인, 회원가입, 상품리스트, 상품리스트 내의 필터기능, 상세페이지 구현이고 추가기능은 장바구니, 주문정보 페이지, 검색기능이다. 나는 상품 리스트와 필터, 상세페이지 API를 구현했다.
각 페이지에 전달할 정보들을 파악하고 그에 맞는 필드구성과 속성사용을 하려고 노력했다.

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

    class Meta:
        db_table       = 'categories'



class SubCategory(models.Model): 
    name               = models.CharField(max_length = 50)
    category           = models.ForeignKey('Category', on_delete = models.CASCADE)

    class Meta:
        db_table       = 'subcategories'


class Product(TimeStampModel):
    name               = models.CharField(max_length = 150, unique = True)
    eng_name           = models.CharField(max_length = 250, unique = True)
    roasting_date      = models.DateField()
    price              = models.DecimalField(max_digits = 8, decimal_places = 2)
    subcategory        = models.ForeignKey('Subcategory', on_delete=models.CASCADE)

    class Meta:
        db_table       = 'products'


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

    class Meta:
        db_table       = 'product_images'


class Size(models.Model): 
    name               = models.CharField(max_length = 50)
    price              = models.DecimalField(max_digits = 8, decimal_places = 2)
    product            = models.ForeignKey('Product', on_delete = models.CASCADE)
  
    class Meta:
        db_table       = 'sizes'
  

class Taste(models.Model): 
    name               = models.CharField(max_length = 50)
    products_tastes    = models.ManyToManyField(
        'Product',
        through        = 'TasteByProduct',
        through_fields = ('taste', 'product')
    )

    class Meta:
        db_table       = 'tastes'


class TasteByProduct(models.Model): 
    product            = models.ForeignKey('Product', on_delete = models.CASCADE)
    taste              = models.ForeignKey('Taste',   on_delete = models.CASCADE)

    class Meta: 
        db_table       = 'taste_by_products'

class Grainding(models.Model): 
    type               = models.CharField(max_length = 100)
    products_grainding = models.ManyToManyField(
        'Product',
        through        = 'GraindByProduct',
        through_fields = ('grainding', 'product')
    )

    class Meta: 
        db_table       = 'graindings'


class GraindByProduct(models.Model): 
    product            = models.ForeignKey('Product',   on_delete = models.CASCADE)
    grainding          = models.ForeignKey('Grainding', on_delete = models.CASCADE)

    class Meta: 
        db_table       = 'grainding_by_products'

ManyToManyField through

이번 모델링에는 through속성을 사용했다.
through속성은직접 두테이블을 지정해 관계 테이블을 만들때 사용한다.
관계 테이블을 지정하지 않아도 자동으로 생성 되지만 원하는 필드를 추가해 생성할 수있다는 장점이 있다.

0개의 댓글