노마드 코더 Airbnb 클론 코딩

노마드 코더 에어비앤비 클론 코딩 #7 ORM

gogi masidda 2022. 10. 19. 23:34

ORM(객체 관계 맵핑): Django를 데이터베이스에 연결. 파이썬을 사용하듯이, 관리자 패널을 통하지 않고 데이터베이스와 '직접' 소통하는 법

 

Method

> Django의 shell 시작: 'python manage.py shell' (Django가 구성된 console이 켜짐)

> 우리가 만들었던 Room 모델을 불러옴: 'from rooms.models import Room'

메서드: Django는 우리가 모델을 만들 때 'objects'라는 속성을 자동으로 부여해줌. objects에는 많은 메서드가 있음. 이를 이용하면 데이터베이스가 Room 모델에서 나온 데이터들을 꺼내오도록 시킬 수 있다.
ex) 모든 Room에 접근하고 싶을 때 Room을 import하고 'Room.objects'

'Room.objects.all()': 모든 rooms를 가져옴

'Room.objects.get(name='room_name')': room_name에 맞는 것을 가져옴

'room = Room.objects.get(name='room_name')': room에 저장

'room.owner': ForeignKey를 이용해 user를 가져옴

'room.price = 2000': 값 수정

'room.save()': 데이터베이스에 저장

이외에 .filter(), .create(), .delete() 등이 있다. 

 

QuerySets: 연산자를 함께 묶어주는 일을 함. filter들을 동시에 쓸 수 있도록 해줌.(Room.objects.filer('조건1','조건2',...))

우리가 요청할 때만 QuerySets가 실행됨. 우리에게 실질적으로 필요한 데이터만 딱 찾아옴.

 

Admin Method: __메소드, lookup이라 부름

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#field-lookups

 

QuerySet API reference | Django documentation | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

__contains, __startswith, __endswith 등이 있고, 앞에 __icontains, __istartswith, __iendswith 처럼 i를 붙이면 대소문자 상관없이 검색한다.

 

python파일에도 사용할 수 있다.

admins.py

def total(self,room):
	return room.amenities.count()

models.py

def total_amenities(self):
	return self.room.amenities.count()

 

ForeignKey Filter: 관계를 뒤집어서 접근할 수 있게 해줌. 

예1) 'python manage.py shell'을 하고 'Room.owner'를 하면 '<User:dongjun>'이 나온다. 이것과 반대로 owner의 시점에서 내가 얼마나 많은 room을 가지고 있는지 접근하는 것이다.

예2) 'Review.user'라 하면 작동할 것이다. 이것과 반대로 user가 얼마나 많은 리뷰를 썼는지 접근하는 것이다.

 

#예1
#models.py
owner = models.ForeignKey("users.User",on_delete=models.CASCADE)

#반대의 시점에서. users.User에 username이 있다. username자리가 ForeignKey자리다.
Room.objects.filter(owner__username='dongjun')

하지만 이 방법은 너무 반복적이게 될 수 있다는 문제점이 있다. 그래서 'Reverse Accessors'를 사용한다.

 

Reverse accessors

모델 A가 모델 B의 ForeignKey를 가지고 있을 때, 자동적으로 모델 B는 '모델 A_set'을 받게 된다. ex) chattingroom_set, room.set,...

'me = User.objects.get(...)'
'me.room_set.all()'

이것은 이렇게 사용해야 한다.

 

더욱 간략하게 사용하려면 'related_name'을 사용하면 된다.

#rooms/models.py
owner = models.ForeignKey(...,related_name='rooms')

모델B = models.ForeignKey(...,related_name='모델A')

그러면 'me.rooms.all()'으로 사용할 수 있다.

 

related_name

 

 

728x90