django로 만드는 쇼핑몰 model field 및 meta설정 정리

김홍준·2021년 8월 19일
0

자 오늘은 python django 로 쇼핑몰 프로젝트를 시작했다. 오늘은 model 설정을 완료했다 정리해보자

1번

class Category(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    # 카테고리 이름
    meta_description = models.TextField(blank=True)
    # 카테고리 설명 서치엔진을 위해 검색에 노출될 정보
    slug = models.SlugField(max_length=200, db_index=True, unique=True, allow_unicode=True)
    # ( 접근을위해 pk 대신사용될 값 )

    class Meta: # 이 클래스의 속성 ? 설정을 하는 클래스 meta
        ordering = ['name'] # 이름으로 올림차순
        verbose_name = 'category' # 이건 사용자가 읽기 편하게끔 설정해주는 ( 영어기준으로 단수)
        verbose_name_plural = 'categories' #  # 이건 사용자가 읽기 편하게끔 설정해주는 ( 영어기준으로 복수)

2번

class Product(models.Model):
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=True, allow_unicode=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    description = models.TextField(blank=True)
    meta_description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2) # 소수점으로 하고 9999만원까지했고 0.00까지
    stock = models.PositiveIntegerField() # 상품의 갯수 ( 정수로 설정 ) 
    available_display = models.BooleanField('Display', default=True)
    available_order = models.BooleanField('Order', default=True)

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created', '-updated']
        index_together = [['id','slug']]

    def __str__(self):
        return self.name

    def get_apsolute_url(self):
        return reverse('shop:product_detail', args=[self.id,self.slug])

코드안에/#/내용만으로 이해가 안갈 법한 field 설정만 설명해보자

자 1번 코드는 카테고리를 만들기위한 model이다 우선
name 은 카테고리의 이름을 명칭하는 것이며
db_index 속성은 인덱싱이 가능하게끔 해주는 것이며 True 값을 준다 ( 이름으로도 검색할수있도록 )
allow_unicode에 True 값을 줘야 한국어로 작성을 할수있다
다음으로 2번 코드는 해당 제품에 관한 model이다
category는 포링키 역할을하는데 어떻게하는 것이냐하면
models.ForeignKey타입을 주고
(Category, on_delete=models.SET_NULL, null=True, related_name='products') 괄호 하나 하나 풀이하자
Category는 어떤 class(테이블)과 연결할것이냐를 알리는것이고
on_delete=models.SET_NULL on_delete는 만약 Category가 삭제되면 어떡할것이냐 란 뜻이다
여러가지가있는데
1. CASCADE
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField를 포함하는 모델 인스턴스(row)도 삭제된다. 한마디로 같이 삭제된다
2. PROTECT
ForeignKeyField가 바라보는 값이 삭제될 때 삭제가 되지않도록 ProtectedError를 발생시킨다. 연결되있는 테이블이 삭제되지않도록 에러를 발생시킨다
3. SET_NULL
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField값을 null로 바꾼다. (null=True일 때만 가능) 삭제하지 않고 Null값으로 바꾼다
4. SET_DEFAULT
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField값을 default 값으로 바꾼다. (default값이 있을 때만 가능) 삭제될시 default 값으로 바꾼다(값은 미리 설정) 설정해둔 값으로 바뀌는것이다
5. SET()
ForeignKeyField가 바라보는 값이 삭제될 때 ForeignKeyField값을 SET에 설정된 함수 등에 의해 설정된다. ( 내맘대로 다시 설정한다 )
6. DO_NOTHING
ForeignKeyField가 바라보는 값이 삭제될 때 아무런 행동을 취하지 않는다. 참조무결성을 해칠 위험이 있다
나는 3. SET_NULL 을 사용했다

models.BooleanField 필드는 0과1로만 계산되며
뭐 주로 보이게 할거냐 말거냐 설정할때 쓴다 기본값은 True 설정

class Meta:
다양한 정보를 품고있다 이런 뜻풀이이며
모델안에 meta 클래스는 검색 옵션이라던지 display 이름이라던지 그런것을 설정해주는 것이다 어떤 옵션이 있는지 알아보자

profile
김홍준입니다.

0개의 댓글