class에 is_new
라는 attribute를 추가하고 default = False
라고 하였다. "신상일때만 True 이기 때문!"
class Product(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=1000)
category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True)
is_new = models.BooleanField(default=False)
class Meta:
db_table='products'
그리고 나서 makemigrations
-> migrate
products 를 해주고 table을 통해 column이 추가된걸 확인! False의 상태는 0으로 표시
되는걸 확인했다.
Django shell 을 통해 값을 update 해주었다.
>>> a=Product.objects.filter(id=1)
>>> a.update(is_new=True)
1
다시 table을 통해 값이 1로 바뀐걸 확인! 즉, True의 상태는 1로 표시
된다는걸 알 수 있었다. 이제 신상메뉴일경우 True / False 로 update 하면 된다!
nutrions에는 fat, calories, sugar, ...
등이 있는데 이건 연습이까 3가지 항목에 대해서만 작성하겠다...
그리고, nutrition의 경우 딱 정수로 수치가 나오진 않는다!! 소숫점이 존재!! 따라서 소수점을 출력해주는 Field를 사용해야 한다.
두가지가 있다.
이중에서 제한된 소숫점 자리를 나타내주는 DecimalField
를 사용한다.
그리고 DecimalField에서는 필수로 지정해주어야 하는 옵션이 있다.
바로 표현할 수 있는 숫자의 수(max_digits)와 소수점 위치(decimal_places)
를 지정해야 한다!!
먼저 class Nutrition을 작성한다.
class Nutrition(models.Model):
fat_g = models.DecimalField(max_digits=4, decimal_places=1, null=True)
calories_kcal = models.DecimalField(max_digits=4, decimal_places=1, null=True)
caffeine_mg = models.DecimalField(max_digits=4, decimal_places=1, null=True)
class Meta:
db_table = 'nutritions'
이후 makemigrations
-> migrate
products
그리고 table이 생성되었는지 확인한다.
Django shell 에서도 READ!
간혹 그런 name을 찾을 수 없다고 뜰 때가 있다. 그럴땐 그냥 django shell을 껐다 키면 된다!! (내가 화면을 3개를 띄우고 하나는 프로젝트 / 하나는 django shell / 다른 하나는 mysql을 쓰느라;;)
이제 각 음료마다 수치를 확인해 fat / calories / caffeine
을 입력한다... 음료 3개만 해보자
아... 이거 스타벅스 메뉴인데 소수점이 없네...
어쨋든 table에서는 소수 아래 첫번째 자리까지 표시된다.
AQueryTool template 구조를 참고중인데 여기에는 nutition table에서 음료를 FK 로 받고있다.
따라서 나도 그렇게 설정한다.
다시 products/models.py 에 들어가서 설정
class Nutrition(models.Model):
fat_g = models.DecimalField(max_digits=4, decimal_places=1, null=True)
calories_kcal = models.DecimalField(max_digits=4, decimal_places=1, null=True)
caffeine_mg = models.DecimalField(max_digits=4, decimal_places=1, null=True)
product = models.OneToOneField('Product', on_delete=models.CASCADE, null=True)
class Meta:
db_table='nutritions'
... 처음부터 추가해서 한번에 create 할껄.....
이제 product_id 를 추가해준다..
제대로 참조 되었는지 확인해보기
>>> a=Nutrition.objects.get(id=1)
>>> a.product
<Product: Product object (1)>
... __str__ 추가하고 오겠음...
def __str__(self):
return self.product
바꾼게 없다뇨.. 함수가 잘못됐나?? 다른 형태로 입력해보자.
def __str__(self):
return f'{self.product}'
그래도 안된다.
혹시나 싶어 class Product에 위 함수를 추가했다. 그랬더니 된다..!
참고로 함수를 추가했을땐 makemigrations / migrate 안해도 된다!
OneToMany = ForeignKey