장고는 어플리케이션으로 나누어져있음
어플리케이션 -> 폴더
폴더에 데이터와 로직이 있음
에어비엔비를 app으로 나누다면?
1. room
room을 검색하고 정보를 보고 수정, 삭제, 업로드 가능
데이터는 집, 집사진을 볼 수도 있고 설명을 볼 수도 있음, 집의 이름을 변경할 수도 있음
-> 데이터
2. user
프로필을 설정할 수 있고 소셜 로그인을 할 수 있음.
3. review
review를 위한 데이터와 로직을 다룸, room과 user가 연관됨
-> 여러가지 서비스가 섬과 같이 존재하고 섬들은 유기적으로 연결되어 서비스를 작동시킴
house 어플리케이션을 만듬
python manage.py startapp houses
모델이란 어플리케이션에서 데이터의 모양을 묘사한것
장고는 models.py안의 코드를 가져가서 데이터베이스에게 말을검
-> ORM, SQL사용 안해도됨
from django.db import models
class House(models.Model):
"""Model Definition for Houses"""
name = models.CharField(max_length=140)
price = models.PositiveIntgerField()
description = models.TextField()
address = models.CharField(max_length=140)
Model을 작성해도 장고가 재시작 되지 않음
-> 왜냐하면 setting.py에 명시가 되어있지 않기때문이다.
# setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
해당 부분에 명시해줘야함
python manage.py runserver
이후 재기동하면 model을 수정할때마다 서버가 재기동됨
-> 해당 파일을 프로젝트 파일로 인식했다는 뜻
model을 정의함으로써 얻는 이점
1. 데이터가 어떻게 생겼는지 알기 때문에 데이터에 대한 관리패널을 자동으로 생성해줌
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
pass
# Register your models here.
HouseAdmin이라는 클래스를 만들고 해당 클래스는 admin.ModelAdmin의 자식임
@admin.register의 뜻은 HouseAdmin 클래스가 House Model을 통제할 것이라고 한것
참고) models 안에 House가 선언되어있음 그래서 from .model import House임
위와 같은 상태로 생성을 하면 오류가 발생함
데이터 베이스가 해당 model을 인지하지 못했기 때문임 이를 위해 migration을 해줘야함
-> 데이터베이스의 형태를 수정해줘야함
-> mgiration
python manage.py makemigrations
houses/migrations안에 파일을 만듬
해당 파일안에 model에서 명시했던 부분이 적혀있음
migration을 생성 후 적용해야함
python manage.py migrate
house가 추가되었음
요약
Model을 만든다
migration을 만든다.
migrate를 적용하여 테이블을 생성한다.
House라는 어플리케이션을 만들었고 어플리케이션이란 데이터와 데이터의 로직이 있는 섬과 같은 것
1. 어플리케이션 구분 짓기
#setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'houses.apps.HousesConfig',
]
INSTALLED_APPS를 나눌 수 있음, 두 분류로 나누고 합처서 사용하는 것이 가능함 INSTALLED_APPS는 반드시 있어야함
CUSTOM_APPS = [
"houses.apps.HousesConfig",
]
SYSTEM_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
INSTALLED_APPS = SYSTEM_APPS + CUSTOM_APPS
참고)
CUSTOM_APPS = [
"houses.apps.HousesConfig",
]
SYSTEM_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"houses.apps.HousesConfig",
]
INSTALLED_APPS = SYSTEM_APPS + CUSTOM_APPS
동일한 라벨이 동시에 존재하면 unique 에러 나옴
Model을 고칠때마다 migration을 해줘야함
아까와 동일하게
1. model 수정
2. migration 생성
3. migarte 적용
from django.db import models
class House(models.Model):
"""Model Definition for Houses"""
name = models.CharField(max_length=140)
price_per_night = models.PositiveIntegerField()
description = models.TextField()
address = models.CharField(max_length=140)
pets_allowed = models.BooleanField(default=True)
python manage.py makemigrations
python manage.py migrate
migration파일이 기록되어 있음
migration 설명의 좋은글)
https://tibetsandfox.tistory.com/24
장고(Django) - 마이그레이션(Migration)
마이그레이션(Migration)이란? 장고 공식 문서에서는 마이그레이션이 모델의 변경 내역을 DB *스키마에 적용시키는 장고의 방법이라고 설명하고 있습니다. 장고는 ORM을 사용하기 때문에 models.py와
tibetsandfox.tistory.com
장고에서 house 객체를 String으로 House object로 표현하고 있음
from django.db import models
class House(models.Model):
"""Model Definition for Houses"""
name = models.CharField(max_length=140)
price_per_night = models.PositiveIntegerField()
description = models.TextField()
address = models.CharField(max_length=140)
pets_allowed = models.BooleanField(default=True)
def __str__(self):
return self.name
name으로 수정함
해당 객체의 name을 Beautiful Tent로 저장했기때문에 위와 같이 나옴
위의 테이블을 보면 컬럼이 없음, admin.py를 수정하여 컬럼을 추가할 수 있다.
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = [
"name",
"price_per_night",
"address",
"pets_allowed"
]
# Register your models here.
이런식으로 admin패널을 수정할 수도 있음, 필터같은것도 추가할 수 있다고함, 위의 이미지는 현재 필터가 없는 상태임
필터추가
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = [
"name",
"price_per_night",
"address",
"pets_allowed"
]
list_filter = ["price_per_night", "pets_allowed"]
# Register your models here.
검색 추가
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = [
"name",
"price_per_night",
"address",
"pets_allowed"
]
list_filter = ["price_per_night", "pets_allowed"]
search_fields = ["address"] #주소를 검색해서 표시
# Register your models here.
참고
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = [
"name",
"price_per_night",
"address",
"pets_allowed"
]
list_filter = ["price_per_night", "pets_allowed"]
search_fields = ["address_startswith"]
# Register your models here.
startswith는 해당 문자로 시작하는 객체를 찾아줌
예를 들어 ko를 검색한다면 ko로 시작하는 주소만 검색함
startswith
contan
endwith 등 많음
기본값은 ko라고 치면 ko로 시작하는 거 나옴
장고에서는 리스트를 잘 사용하지 않음
튜플로 바꿔주는게 좋음
from django.contrib import admin
from .models import House
@admin.register(House)
class HouseAdmin(admin.ModelAdmin):
list_display = (
"name",
"price_per_night",
"address",
"pets_allowed"
)
list_filter = ("price_per_night", "pets_allowed")
search_fields = ("address",) #tuple에 하나만 들어있다면 콤마를 끝에 찍어줘야함
# Register your models here.
help_text
from django.db import models
class House(models.Model):
"""Model Definition for Houses"""
name = models.CharField(max_length=140)
price_per_night = models.PositiveIntegerField()
description = models.TextField()
address = models.CharField(max_length=140)
pets_allowed = models.BooleanField(default=True, help_text="Does this house allow pets?")
def __str__(self):
return self.name
'2024 > python 개발자 되기' 카테고리의 다른 글
[Day-4][Django] Custom User add Custom Fields (0) | 2024.05.20 |
---|---|
[Day-3][Django] Custom User (0) | 2024.05.19 |
[Day-2][Django] User 패널 수정 (0) | 2024.05.18 |
[Day-1][Django] 라이브러리와 프레임워크에 대한 차이(관리자 페이지 시간, 언어 변경) (0) | 2024.05.16 |
[개요] 목표 (0) | 2024.05.16 |