개발하면서적는글
[django/python] Reverse Accessor
옥수수왕자
2024. 6. 8. 16:47
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()