dir에 접근하기 위해 pipenv shell
로 가상환경에 접근 후 python manage.py shell
을 입력해 shell로 들어옵니다.
그리고 User라는 클래스로 들어오기 위해 import를 해 줍니다.
어떻게 데이터베이스로부터 objects를 가져올까요? 예를 들어 두명의 사용자를 어떻게 가져올까요?
dir(User)
를 입력합니다.
dir는 클래스 안의 names 리스트들을 리턴합니다.
vars(User)
를 입력합니다.
vars는 __dict__
, dictionary 또는 클래스 리스트 안의 나타내는 것을 리턴합니다. User클래스는 AbstractUser을 상속받고, 이는 AbstractBasicUser을 사용하고, 이는 models을 사용하기 때문에 manager을 포함하여 직접 생성하지 않은 것들을 가져올 수 있습니다.
manager
란 데이터베이스로부터 elements를 가져오게 해주는 것입니다. sql을 쓰지 않고 파이썬을 이용하여 가져올 수 있으며 장고의 파워 중 하나입니다.
데이터 모델을 생성하기만 하면 장고가 자동으로 database-abstraction API
를 줍니다. 이 API는 objects를 생성하고, 검색하고, 업데이트하고, 삭제(CRUD)할 수 있도록 합니다.
QuerySet
이란 데이터베이스로 부터 온 똑똑한 object 리스트입니다.
User.objects.all()
#<QuerySet [<User>: David_Kim, <User>:Tanon_Kim] >
위 코드를 입력하면 QuerySet
을 리턴합니다.
all_user = User.objects.all()
all_user.filter(superhost=True)
#<QuerySet [<User>: tanonkim] >
위 코드처럼 filter, exclude, annotate 등을 걸 수도 있으며 모든 것들을 볼 수 있습니다.
user 중 tanonkim을 가져옵니다.
더 깊이 보기 위해 dir(David_Kim)
을 입력합니다. 아래는 그 결과입니다.
message_set, room_set, review_set..... user가 set으로 무엇을 하는 걸까요..?
room을 생성하고 그 room은 Foreign Keys를 가지고 있기 때문에 host를 가집니다. 또한 user을 가리키고 있는 rooms들에도 접근할 수 있습니다. 바로 set을 이용해서 말이죠!
어드민 패널에 가보면 rooms을 위한 정보가 없지만 코드상에는 정보가 있는 이유도 이 때문입니다. 만약 foreign key를 element로 가리키면 그 element 또한 foreign key에 접근할 수 있습니다. related_name
을 가지고요!
class Room(core_models.TimeStampedModel):
amenities = models.ManyToManyField("Amenity", related_name="rooms", blank=True)
facilities = models.ManyToManyField("Facility", related_name="rooms", blank=True)
houserules = models.ManyToManyField("HouseRule", related_name="rooms", blank=True)
다른 예로 q라는 Question model(1) 에 ForeignKey로 연결된 a라는 Answer model(N) 이 있다고 해봅시다.
a를 통하여 Question을 얻고 싶다면 다음과 같이 쉽게 얻을 수 있는데요!
a.question
Answer 모델 객체인 a에는 question 속성이 있으므로 a를 통해 질문을 찾는 것은 매우 쉽습니다. 그렇다면 반대로 질문을 통해 답변을 찾을 수 있을까요? Question 모델에는 답변 속성이 없어서 불가능할 것 같지만 실제로는 가능합니다.
answer_set
을 사용하면 됩니다.
q.answer_set.all()
Question 모델과 Answer 모델처럼 서로 연결되어 있으면 연결모델명_set과 같은 방법으로 연결된 데이터를 조회할 수 있습니다.
1) related_name
by ManyToOne
related_name 을 통하여 user(1) 입장에서 room(N)을 찾을수도 있습니다.
room models에서 related_name 을 적어주면 그 이름을 통하여 user에서 room을 역참조 할 수 있습니다.
+) migrate하는 건 잊지 말아요!
2) ManyToMany
, OneToOne
의 관계에서는 room.amenities.all() 처럼 그냥 가져오면 됩니다!
3) query_set manager
메니저 로부터 all(), filter(), count() 등을 사용할 수 있습니다.