ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • django.4 스타벅스 모델링 과제_wecode
    Django 2020. 11. 26. 18:17
    728x90

    먼저 나는 해당 자료를 통해 다시 한번 공부하기 위함이고, 이 자료는 순전히 나를 위한 자료이다.

    나또한 구글링을 할경우 기존 wecode 선배기수들이 작성했던 자료들은

    정말 유용하였다

    하지만, 나처럼 구글링을 통해 찾아오는 wecode 출신 개발자들이 있다면 과제를 진행할때는 만큼은 절대 보지 말고 혼자서 해봐야

    실력있는 개발자가 된다는걸 다시 한번 생각해봤으면 한다. (뒤로가기)


     

     

    1. 모델링 한 스타벅스 기준으로 장고 models.py 작성하고 마이그레이션 하고 마이그레이트 해서
    sqlite3 db.sqlite3 실행해서 확인 (.tables) 명령으로 내가 작성한 class 들이 sqlite3에 잘 들어갔는지 확인해보기

    # polls/models.py
    
    class Menu(models.Model):
    	menu_name = models.CharField(max_length=40)
        
    	def __str__(self):
    		return self.menu_name
    
    class Categories(models.Model):
        menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
        categorie_name = models.CharField(max_length=40)
    
        def __str__(self):
            return self.categorie_name
    
    class Images (models.Model):
        image_url = models.URLField(max_length=2000)
        drink_img = models.ForeignKey(Drinks, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.image_url
    
    class Drinks (models.Model):
        categories = models.ForeignKey(Categories, on_delet=models.CASCADE)
        drink_korean_name = models.CharField(max_length=45)
        drink_english_name = models.CharField(max_length=45)
        description = models.TextField()
    
        def __str__(self):
            return self.drink_korean_name
    
    class Allergy(models.Model):
        allergy_name = models.CharField(max_length=45)
    
        def __str__(self):
            return self.allergy_name
    
    class Allergy_drink(models.Model):
        allergy = models.ForeignKey(Allergy, on_delete=models.CASCADE)
        drink = models.ForeignKey(Drinks, on_delete=models.CASCADE)
    
        # def __str__(self):
            # return 
        
    class Nutritions(models.Model):
        kcal = models.DecimalField(max_digits = 10, decimal_places = 2)
        sodium = models.DecimalField(max_digits = 10, decimal_places = 2)
        fat = models.DecimalField(max_digits = 10, decimal_places = 2)
        sugar = models.DecimalField(max_digits = 10, decimal_places = 2)
        protein = models.DecimalField(max_digits = 10, decimal_places = 2)
        caffeine = models.DecimalField(max_digits = 10, decimal_places = 2)
        dirnk_nu = models.ForeignKey(Drinks, on_delete=models.CASCADE)
    
        # def __str__(self):
            # return 
    
    class Sizes(models.Model):
        size_name = models.CharField(max_length=45)
        size_ml = models.CharField(max_length=45)
        size_ounce = models.CharField(max_length=45)
        nutrition = models.ForeignKey(Nutritions, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.size_name

    위 코드로 models.py를 구성하고 이제 모델을 활성화 시켜보자.

    python3 manage.py makemigrations polls

    과정 중 에러가 많이 발견되어 구글링으로 수정하였다

    문법 및 중개테이블 ManyToMantField 등 문법을 바꿔보니 문제없이 가능하였다!!

    # polls/models.py
    import datetime 
    
    from django.db import models 
    from django.utils import timezone 
    
    class Menu(models.Model):
    	menu_name = models.CharField(max_length=40)
        
    	def __str__(self):
    		return self.menu_name
    
    class Categories(models.Model):
        menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
        categorie_name = models.CharField(max_length=40)
    
        def __str__(self):
            return self.categorie_name
    
    class Drinks (models.Model):
        drink_korean_name = models.CharField(max_length=45)
        drink_english_name = models.CharField(max_length=45)
        description = models.TextField()
        categories = models.ForeignKey('Categories', on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.drink_korean_name
    
    class Images (models.Model):
        image_url = models.URLField(max_length=2000)
        drink_img = models.ForeignKey('Drinks', on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.image_url
    
    class Allergy(models.Model):
        allergy_name = models.CharField(max_length=45)
        name = models.ManyToManyField('Drinks', through="Allergy_drink")
    
        def __str__(self):
            return self.allergy_name
    
    class Allergy_drink(models.Model):
        allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
        drink = models.ForeignKey('Drinks', on_delete=models.CASCADE)
    
        # def __str__(self):
            # return 
        
    class Nutritions(models.Model):
        kcal = models.DecimalField(max_digits = 10, decimal_places = 2)
        sodium = models.DecimalField(max_digits = 10, decimal_places = 2)
        fat = models.DecimalField(max_digits = 10, decimal_places = 2)
        sugar = models.DecimalField(max_digits = 10, decimal_places = 2)
        protein = models.DecimalField(max_digits = 10, decimal_places = 2)
        caffeine = models.DecimalField(max_digits = 10, decimal_places = 2)
        dirnk_nu = models.ForeignKey('Drinks', on_delete=models.CASCADE)
    
        # def __str__(self):
            # return 
    
    class Sizes(models.Model):
        size_name = models.CharField(max_length=45)
        size_ml = models.CharField(max_length=45)
        size_ounce = models.CharField(max_length=45)
        nutrition = models.ForeignKey('Nutritions', on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.size_name

    활성화 하기 전 해야하는 것 makemigrations 라는 명령어로 내가 모델을 변경시킨 사실 (또는 생성했다는 사실)과 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려줘야한다.

    python3 manage.py makemigrations polls

    그 다음은 migrate 명령어로 데이터베이스에 모델과 관련된 테이블을 생성하는 것이다.

    python3 manage.py migrate


    앞에서도 다뤘지만 SQlite에 대해 다시 한번 정리해보고 넘어가자

    먼저 장고의 기본으로 설치되는 데이터베이스 엔진은 SQLite3로 정의되어있다.

    SQLite3 는 파일 기반의 아주 작은 데이터베이스이다

    SQLite는 주로 개발용이나 소규모 프로젝트용으로 사용되는 가벼운 파일 기바의 데이터베이스이다.

    개발시에는 SQLite로 빠르게 개발하고 실제 운영시스템은 좀 더 규모가 있는 DB를 사용하는게 일반적인 패턴이다.


    자 이제 테이블이 정상적으로 sqlite3 db에 생성되었는지 조회 해보도록 하자

    먼저 SQLite3를 이용해 db.sqlite3 안을 보도록 하자

    DB내 모든 TABLE 보기 명령어를 입력해보았다

    출처 : https://m.blog.naver.com/raljo/220555814905

    그런데 아래와 같이 너무 많은 자료가 나와서 사실 이걸보고서 테이블이 정확히 생성이 되었는지 안되었는지

    이해가 쉽게 되진 않았다

    다른 명령어인 .tables 를 사용해보자

    제대로 만들어진 것을 확인 할 수 있었다.

    점점 공부하고 정상적으로 실행 될 경우 너무너무 뿌듯하였다. 시간을 되돌린다면 컴공을 갈것이다.


    여기서 DB Tool에 대해 간략히 설명하자면

    DB를 설치해서 사용할 때 여러가지 관리적 편리함을 위해서 DB Tool을 많이 사용한다

    MsSQL은 SSMS

    Postgres는 Pgadmin

    MySQL은 Workbench

    SQLite3 는 SQLite Browser 라는 것을 사용한다.


    아래를 보면 중간 테이블과 영양정보등 원하는 내용이 테이블로 만들어진 것을 볼 수 있었다.

    여기서 나는 테이블 8개를 만들었는데, 나머지는 테이블들은

    migrate를 수행하면 admin, auth, contenttypes, sessions 앱들이 사용하는 테이블들이 자동으로 생성된다.

    어떤 테이블들이 생성되는지 알 필요는 없다. 위의 앱들을 사용하더라도 테이블을 직접 건드릴 일은 없기 때문이다.

    <출처 : wikidocs.net/70650#migrate>


    나는 아래 주소에서 homebrew를 통해 SQLite browser를 설치하였다

    sqlitebrowser.org/dl/

     

    Downloads - DB Browser for SQLite

    (Please consider sponsoring us on Patreon 😄) Windows Our latest release (3.12.1) for Windows: Windows PortableApp There is a PortableApp available, but it’s still the previous (3.12.0) release version. It should be updated to 3.12.1 over the next few

    sqlitebrowser.org

     


     

    구글링해서 sqlite3에서 테이블 column 조회 하는 명령어 조사 하고 실행해 보기

     

    1) 테이블 확인하기

    sqlite> .tables

    2) 테이블 컬럼정보 확인하기

    sqlite> pragma table_info(TABLE_NAME);

    여기서 table_name = 앱_클래스명(테이블명) 으로 접근해야 원하는 결과가 나온다

    

     

    여기서 위의 models.py에서 작성되었던 클래스 중 2개만 가져와 함께 보면 이해가 빠르다.

    Drinks 테이블은 아래와 같이 표현이 가능하다

    id d_k_n d_e_n desc cate_id(FK)
    integer varchar(45) varchar(45) text integer

    즉 위 명령어로 해당 테이블의 컬럼수와 이름을 한눈에 파악하기 쉬웠다.

    table만을 이용한다면 전체적으로 테이블이 무엇무엇이 있는지를 파악했다면

    table의 column 정보를 본다면 해당 테이블이 어떻게 구성되어있는지 파악이 가능한 장점이 있다.

    # polls/models.py
    
    class Drinks (models.Model):
        drink_korean_name = models.CharField(max_length=45)
        drink_english_name = models.CharField(max_length=45)
        description = models.TextField()
        categories = models.ForeignKey('Categories', on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.drink_korean_name
    
    class Allergy_drink(models.Model):
        allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
        drink = models.ForeignKey('Drinks', on_delete=models.CASCADE)
    
        # def __str__(self):
            # return 

     

    스타벅스 음료 데이터를 크롤링 (Beautiful Soup or selenium 사용) 해서 csv 파일에 저장하기

     

    크롤링 한 데이터를 sqlite3 에 데이터 입력하기

    ( 최초 접근은 장고 파이썬 쉘 환경에서 몇개만 입력해보고 이것을 코드로 작성해서 입력하는 스크립트 작성)

     

    데이터 입력 후에 sqlite 에서 SQL 문으로 select 해서 입력한 데이터 확인하기

     

    장고 파이썬 쉘(콘다 실행 후 python manage.py shell) 에서 Drink.objects.all() 을 입력해보고

    sqlite 에서 select * from drinks; 로 쿼리한 데이터와 비교해보기

     

    JOIN 쿼리문으로 음료의 이름, 설명, 이미지들 쿼리 해보기

     

    JOIN 쿼리문으로 음료의 이름, 설명, 영양정보 쿼리 해보기

    728x90

    'Django' 카테고리의 다른 글

    wecode_CRUD_1 과제  (0) 2020.11.28
    django.6 가상환경 내에서 data 집어넣기  (0) 2020.11.28
    django.3 미니콘다 가상환경 설정 및 CRUD_1  (0) 2020.11.25
    django.2 튜토리얼  (0) 2020.11.24
    Djange.1 Django 기초  (0) 2020.11.23
Designed by Tistory.