#6.0 User Model
poetry add Pillow
- 가상환경에 pillow 추가 (사진 넣기 가능)
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class GenderChoices(models.TextChoices):
MALE = ("male","Male")
FEMALE = ("female","Female")
class LanguageChoices(models.TextChoices):
KR = ("kr","Korean")
EN = ("en","English")
class CurrencyChoices(models.TextChoices):
WON = "won", "Korean Won"
USD = "usd", "Dollar"
first_name = models.CharField(max_length=150,
editable=False)
last_name = models.CharField(max_length=150,
editable=False)
avatar = models.ImageField(blank=True)
name = models.CharField(max_length=150,
default="")
is_host = models.BooleanField(null=True,
)
gender = models.CharField(max_length=10,
choices= GenderChoices.choices,
)
language = models.CharField(max_length=2,
choices=LanguageChoices.choices,
)
currency = models.CharField(max_length=5,
choices = CurrencyChoices.choices,
)
- models.py 다음과 같이 설정
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
@admin.register(User)
class CustomerUserAdmin(UserAdmin):
fieldsets = (
("Profile",
{
"fields": ("avatar",
"username",
"password",
"name",
"email",
"is_host",
"gender",
"language",
"currency"
),
},
),
("Permissions",{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
("Important Dates", {"fields": ("last_login",
"date_joined"),
},
),
)
list_display = ("username", "email","name","is_host")
- admin.py도 다음과 같이 설정
#6.1 Room Model
python manage.py startapp rooms
실행 후,
from django.db import models
class Room(models.Model):
"""Room Model Definition"""
class RoomKindChoices(models.TextChoices):
ENTIRE_PLACE = ("entire_place", "Entire Place")
PRIVATE_ROOM = ("private_room", "Private Room")
SHARED_ROOM = "shared_room", "Shared Room"
country = models.CharField(
max_length=50,
default="한국",
)
city = models.CharField(
max_length=80,
default="서울",
)
price = models.PositiveIntegerField()
rooms = models.PositiveIntegerField()
toilets = models.PositiveIntegerField()
description = models.TextField()
address = models.CharField(
max_length=250,
)
pet_friendly = models.BooleanField(
default=True,
)
kind = models.CharField(
max_length=20,
choices=RoomKindChoices.choices,
)
owner = models.ForeignKey(
"users.User",
on_delete=models.CASCADE,
)
class Amenity(models.Model):
"""Amenity Definiton"""
name = models.CharField(
max_length=150,
)
description = models.CharField(
max_length=150,
null=True,
)
- 다음과 같이 models.py 수정
#6.2 Many to Many
- Many to one
- One to Many
- Many yo Many
amenities = models.ManyToManyField("rooms.Amenity",
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
- models.py에 다음 부분 추가
- auto_now_add랑 auto_now 차이?
- auto_now: object가 저장될 때마다 해당 필드를 현재 date로 설정
- auto_now_add: django가 업데이트할 때마다 date 설정
- 근데 앞으로 만들 모든 모델에대해 이 created_at이랑 updated_at을 추가하기는 너무 귀찮음, 따라서 app을 하나 더 만들고, app끼리 공유할 수 있는 코드를 가지게 한다!
python manage.py startapp common
- common: 모두가 공유 가능한 공통 코드를 가지고 있을 앱
- settings에 추가!
- common의 model에는 abstract model을 만들어서 데이터베이스에는 추가하지 않을 것임
from django.db import models
class CommonModel(models.Model):
'''Common Model Definition'''
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
- common의 model 다음과 같이 설정 abstract = True를 해줌으로써 데이터베이스에 추가 되지 않음
- 그리고 다른 model에
from common.models import CommonModel
- 다음과 같이 import해주고, class의 인자 안을 CommonModel로 변경해줌
- user를 제외한 모델 다 변경
- 그리고 서버 열고,..makemigrations, migrate작업하기
#6.3 Recap
- Rooms의 admin추가하기!
- likethis~
from django.contrib import admin
from .models import Room, Amenity
@admin.register(Room)
class RoomAdmin(admin.ModelAdmin):
pass
@admin.register(Amenity)
class AmenityAdmin(admin.ModelAdmin):
pass
- 서버로 가면 room이랑 amenity가 보인다 이말씀~
#6.4 Rooms Admin
- class를 string으로 보여주는 방법 → str method
- models.py에
- 이거 추가해서 class가 아니라 string으로 보여줄 수 있음
def __str__(self):
return self.name
- 그리고 room의 admin설정하기~
- 추가로 created_at이랑 updated_at도 보이게 할 수 있음
from django.contrib import admin
from .models import Room, Amenity
@admin.register(Room)
class RoomAdmin(admin.ModelAdmin):
list_display = (
"name",
"price",
"kind",
"owner",
"created_at",
"updated_at",
)
list_filter = (
"country",
"city",
"pet_friendly",
"kind",
"amenities",
"created_at",
"updated_at",
)
@admin.register(Amenity)
class AmenityAdmin(admin.ModelAdmin):
list_display = (
"name",
"description",
"created_at",
"updated_at",
)
readonly_fields = (
"created_at",
"updated_at",
)
#6.5 Experiences
- experience 기능을 추가해보자.
- models.py 먼저
from django.db import models
from common.models import CommonModel
class Experience(CommonModel):
"""Experience Model Definiiton"""
country = models.CharField(
max_length=50,
default="한국",
)
city = models.CharField(
max_length=80,
default="서울",
)
name = models.CharField(
max_length=250,
)
host = models.ForeignKey(
"users.User",
on_delete=models.CASCADE,
)
price = models.PositiveIntegerField()
address = models.CharField(
max_length=250,
)
start = models.TimeField()
end = models.TimeField()
description = models.TextField()
perks = models.ManyToManyField(
"experiences.Perk",
)
def __str__(self) -> str:
return self.name
class Perk(CommonModel):
"""What is included on an Experience"""
name = models.CharField(
max_length=100,
)
details = models.CharField(
max_length=250,
blank=True,
default="",
)
explanation = models.TextField(
blank=True,
default="",
)
def __str__(self) -> str:
return self.name
- host, user가 자신의 계정을 지우면 이 experience 도 지워지게 할 것임
- 하고 makemigrations, migrate 해주기
- 그리고 experience 의 admin 으로 가자
from django.contrib import admin
from .models import Experience, Perk
@admin.register(Experience)
class ExperienceAdmin(admin.ModelAdmin):
list_display = (
"name",
"price",
"start",
"end",
"created_at",
)
@admin.register(Perk)
class PerkAdmin(admin.ModelAdmin):
list_display = (
"name",
"details",
"explanation",
)
쨘~
#6.6 Categories
python manage.py startapp categories
- settings 가서 custom_apps에 추가해주기
"categories.apps.CategoriesConfig"
- categories의 models 수정
from django.db import models
from common.models import CommonModel
class Category(CommonModel):
"""Room or Experience Category"""
class CategoryKindChoices(models.TextChoices):
ROOMS = "rooms", "Rooms"
EXPERIENCES = "experiences", "Experiences"
name = models.CharField(max_length=50)
kind = models.CharField(
max_length=15,
choices=CategoryKindChoices.choices,
)
def __str__(self) -> str:
return f"{self.kind.title()}: {self.name}"
class Meta:
verbose_name_plural = "Categories"
- categories의 admin 패널 수정
from django.contrib import admin
from .models import Category
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = (
"name",
"kind",
)
list_filter = ("kind",)
- like this~
#6.7 Reviews
- 리뷰 만들어볼 것임!!
python manage.py startapp reviews
해주고~ settings가서 설치 해주기
"reviews.apps.ReviewsConfig”
- models가서 마찬가지로 CommonModel 임포트 해주고 코드 작성
- 리뷰를 생성하는 유저가 ForeignKey, 앱은 users 모델은 User
- 유저가 삭제되면 리뷰도 삭제되도록 CASCADE 옵션으로 설정함
#6.8 Wishlists
#6.9 Bookings
#6.10 Medias
#6.11 Direct Messages
'Backend > Django' 카테고리의 다른 글
[백엔드][장고][Django] Chapter #8 (0) | 2023.07.17 |
---|---|
[백엔드][장고][Django] Chapter #7 (0) | 2023.07.17 |
[백엔드][장고][Django] Chapter #5 (0) | 2023.07.13 |
[백엔드][장고][Django] Chapter #4 (0) | 2023.07.13 |
[백엔드][장고][Django] Chapter #3 (0) | 2023.07.13 |
Uploaded by Notion2Tistory v1.1.0