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
__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()'으로 사용할 수 있다.
'노마드 코더 Airbnb 클론 코딩' 카테고리의 다른 글
노마드 코더 에어비앤비 클론 코딩 #9 Urls and Views (0) | 2022.10.26 |
---|---|
노마드 코더 에어비앤비 클론 코딩 #8 Power Admin (0) | 2022.10.21 |
노마드 코더 에어비앤비 클론코딩 #6 Models and Admin (0) | 2022.10.17 |
노마드 코더 에어비앤비 클론코딩 #5 USERS APP (1) | 2022.10.13 |
노마드 코더 에어비앤비 클론코딩 #4 App 만들기 (0) | 2022.10.09 |