Django 4

김기현·2022년 2월 4일
0

django

목록 보기
4/8
post-thumbnail

dir vs vars

dir

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을 포함하여 직접 생성하지 않은 것들을 가져올 수 있습니다.

Managers


manager란 데이터베이스로부터 elements를 가져오게 해주는 것입니다. sql을 쓰지 않고 파이썬을 이용하여 가져올 수 있으며 장고의 파워 중 하나입니다.

데이터 모델을 생성하기만 하면 장고가 자동으로 database-abstraction API를 줍니다. 이 API는 objects를 생성하고, 검색하고, 업데이트하고, 삭제(CRUD)할 수 있도록 합니다.

QuerySet

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을 가져옵니다.

SET

더 깊이 보기 위해 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과 같은 방법으로 연결된 데이터를 조회할 수 있습니다.

RECAP

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() 등을 사용할 수 있습니다.

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글