본문 바로가기
개발하면서적는글

[django/python] Reverse Accessor

by 옥수수왕자 2024. 6. 8.

django Model 에서 ForeignKey 를 사용했을 때

역방향으로 접근하는 방법

 

예를 들어

쇼핑몰에서 물건을 판매중인 seller의 마이페이지를 구성한다고 해보자

Product 모델에서 User 모델을 참조하여 seller 필드를 정의한 상황

 

특정 seller 가 가진 Product 를 전부 가져와야한다.

아래 처럼 ORM으로 filter 를 사용해서 조회할 수도 있다.

Product.objects.filter(seller__username='Mark')

 

 

그런데 Transaction 모델에서도 특정 seller 가 가지는 주문 건을 모두 보려고 한다면 ? Product, Transaction,  Review, .. 또는 다른 모델에서 전부 필터를 해서 데이터를 가져와서 context로 만들어야하는데 이것은 매우 비효율적

 

이럴 경우 reverse accessor 를 사용하면 더 효율적으로 구성할 수 있다.

사용은 간단한데, [Model]_set 을 사용해주면 된다.

# seller 객체를 만든 후
seller1 = User.objects.get(pk=1)

# 그 객체가 참조된 모델의 리스트
seller1.product_set.all()
seller1.transaction_set.all()

 

 

product_set 을 대체하는 방법으로 Model 에  related_name 을 parameter 로 넣어줄 수 있다.

# Product Model

seller = models.ForeignKey(
	"User",
    on_delete=models.CASCADE,
    related_name = "products",
    )

 

 

related_name 을 쓰면 더 직관적으로 구문을 작성할 수 있다.

# seller 객체를 만든 후
seller1 = User.objects.get(pk=1)

# products_set -> product 대체
seller1.products.all()

 

댓글