Django-DB 연습 #3

채록·2021년 1월 24일
0

Python & Django

목록 보기
10/34
post-thumbnail

🐶 To do list

  • 신상여부에 대해 drinks table에 Boolean type으로 생성
  • drink와 nutrition one to one으로 연결




I. BooleanField

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-> migrateproducts 를 해주고 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 하면 된다!





II. Nutrition

nutrions에는 fat, calories, sugar, ... 등이 있는데 이건 연습이까 3가지 항목에 대해서만 작성하겠다...

그리고, nutrition의 경우 딱 정수로 수치가 나오진 않는다!! 소숫점이 존재!! 따라서 소수점을 출력해주는 Field를 사용해야 한다.

두가지가 있다.

  1. FloatField
  2. DecimalField

이중에서 제한된 소숫점 자리를 나타내주는 DecimalField를 사용한다.

그리고 DecimalField에서는 필수로 지정해주어야 하는 옵션이 있다.
바로 표현할 수 있는 숫자의 수(max_digits)와 소수점 위치(decimal_places)를 지정해야 한다!!

1. DecimalField

먼저 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 -> migrateproducts

그리고 table이 생성되었는지 확인한다.
Django shell 에서도 READ!
간혹 그런 name을 찾을 수 없다고 뜰 때가 있다. 그럴땐 그냥 django shell을 껐다 키면 된다!! (내가 화면을 3개를 띄우고 하나는 프로젝트 / 하나는 django shell / 다른 하나는 mysql을 쓰느라;;)

이제 각 음료마다 수치를 확인해 fat / calories / caffeine을 입력한다... 음료 3개만 해보자

아... 이거 스타벅스 메뉴인데 소수점이 없네...


어쨋든 table에서는 소수 아래 첫번째 자리까지 표시된다.



2. OnetoOne 연결

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 안해도 된다!



끝!





🐱 추가 할 것

  • URLField 사용 법 익혀 사진 url 추가하기 OneToMany = ForeignKey
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글