ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] app(폴더) 및 model 만들기
    파이썬/Django 2022. 12. 7. 11:56
    728x90
    반응형

    app 생성하기

    장고에서 말하는 app이란?

    app(폴더)는 프로젝트의 구성 단위이다. 숙박업체 예약서비스를 만든다고 가정하면 숙소정보를 담은 house app과 사용자 정보를 담는 uesr app, 리뷰를 볼 수 있는 review app 등등이 필요할 것이다.

     

    app 생성하기

    python manage.py startapp [앱 이름]

    앱 이름을 houses 라고 지었다면, 프로젝트 폴더 안에 houses 라는 폴더가 하나 생겼을 것이다. 그리고 폴더 내부에 models.py 파일에 model 정보를 작성한다.

     

    장고의 작동 원리를 알고 싶다면,

    settings.py , helloworld.html, views.py, urls.py , manage.py 파일들끼리 서로 데이터를 어떻게 처리하고 연결하는지 흐름을 이해하면 된다.

     

    model 생성하기

    장고에서 말하는 model은 app 내에서 데이터의 모양을 적어놓은 파일이다.

    예를 들어 위에서 생성한 houses app의 model 파일을 작성해보자.

     

    from django.db import models
    
    class House(models.Model):
        
        # 모델을 만들때 관례적으로 적는 것(모델에 대한 설명)
        """Model Definition for Houses"""
        
        # CharField() : 적당한 길이를 가진 문자열
        name = models.CharField(max_length=140) 
        # PositiveIntegerField() : 양의 정수
        price_per_night = models.PositiveIntegerField(verbose_name="Price") 
        # TextField() : 긴 길이를 가진 문자열
        description = models.TextField() 
        address = models.CharField(max_length=140)
        pets_allowed = models.BooleanField(default=True)
        
        # 숙소 이름이 컬럼에 바로 보이도록 설정
        def __str__(self):
            return self.name

     

    그리고 이제 app에 대한 model 정보를 장고에게 알려주어야 한다.

    config/settings.py 파일 내부에 INSTALLED_APPS이란 리스트가 있는데 말 그대로 설치되어있는 app들을 담는 리스트이다.

    INSTALLED_APPS 리스트에 우리가 새로 생성한 app 이름을 추가해주면 된다.

     

    데이터베이스 정보 설정하고 migrations migrate해주기

     

    이제 앱과 모델을 생성했기 때문에 모델의 데이터베이스를 어떻게 어드민패널에 노출시킬 것인지 정하기 위해 클래스를 생성한다. 내부에 컬럼을 보여줄 튜플들을 작성한다.

    from django.contrib import admin
    from .models import House
    
    # Register your models here.
    
    # admin패널에 'House'라는 model을 등록하고 싶다는 의미
    # decorator 이 데코레이터의 의미: 이 class가 House model을 통제할 것이다.
    @admin.register(House) 
    class HouseAdmin(admin.ModelAdmin):
        
        # column을 보여주는 리스트 (보여 줄 필드를 리스트[] 안에 넣기) -> 리스트보다 튜플()이 더 자주 사용됨
        list_display = (
            "name",
            "price_per_night",
            "address",
            "pets_allowed"
        )
        
        # 필터링 할 메뉴
        list_filter = ("price_per_night", "pets_allowed")
    
        # 검색하기
        search_fields = ("address")
        # search_fields = ["address__startswith"] startswit h는 검색하 ㄴ단어로 '시작'하는 것만 검색 / endswith 도 있음
        
    # class를 만듬. 이 class는 ModelAdmin(어드민패널)의 모든 것을 상속받음

    어드민 패널에 노출시킬 각 컬럼 정보를 담은 튜플을 생성했으니 이제 DB파일(db.sqlite3)에게 이 사실을 알려야 한다. 

     

    python manage.py makemigrations

    이제 houses app 폴더 내부에 migrations 파일이 자동으로 생성되었다.

    생성된 마이그레이션들을 다시 migrate 해준다.

    python manage.py migrate

     

    이로써 설정해준 어드민패널 정보가 모두 반영되었다. 8000/admin 주소로 가서 확인을 해보면 입력한 DB 정보가 잘 나와있는 것을 볼 수 있다. 설정해준 대로 숙소 정보를 하나 입력한다. 그리고 서버를 종료해도 숙소 정보는 데이터베이스에 여전히 살아있는 것을 확인할 수 있다. How cool is that 

     

    더보기

    이 부분이 이해가 잘 안가면 #4.2 Recap을 다시 보자

     

    팁.

    INSTALLED_APPS 에 기존 앱들과 내가 새로 생성한 앱을 구분하여 관리하고 싶다면 새 리스트를 두개를 만들어서 나눠 저장한 후에 INSTALLED_APPS = A + B 해주면 된다. 장고는 INSTALLED_APPS 변수를 주시할 것이기 때문에 반드시 이 키워드를 사용해야 한다.

    LIST
Designed by Tistory.