Skip to content

Commit e469957

Browse files
committed
refactor: OrderProductRelation 및 PaymentHistory의 prefetch 쿼리를 분리
1 parent 20fa5e9 commit e469957

1 file changed

Lines changed: 31 additions & 28 deletions

File tree

app/admin_api/views/shop/orders.py

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,33 @@
2828
ADMIN_METHODS = ["list", "retrieve", "partial_update"]
2929

3030

31+
# OrderProductRelation + nested Options prefetch — `Order.products` 용.
32+
_OPR_PREFETCH_QS = (
33+
OrderProductRelation.objects.filter_active()
34+
.select_related("product")
35+
.prefetch_related(
36+
models.Prefetch(
37+
"options",
38+
queryset=OrderProductOptionRelation.objects.filter_active().select_related(
39+
"product_option_group", "product_option"
40+
),
41+
),
42+
)
43+
)
44+
45+
# `Order.payment_histories` 용 prefetch — 최신순.
46+
_PAYMENT_HISTORY_PREFETCH_QS = PaymentHistory.objects.filter_active().order_by("-created_at")
47+
48+
49+
def _payment_history_created_at_subquery(*, latest: bool) -> models.Subquery:
50+
"""Order 별 첫/마지막 PaymentHistory.created_at scalar subquery (filter/annotate 양쪽 용)."""
51+
return models.Subquery(
52+
PaymentHistory.objects.filter(order_id=models.OuterRef("pk"))
53+
.order_by("-created_at" if latest else "created_at")
54+
.values("created_at")[:1]
55+
)
56+
57+
3158
@extend_schema_view(**{m: extend_schema(tags=[OpenAPITag.ADMIN_SHOP_ORDER]) for m in ADMIN_METHODS})
3259
class OrderAdminViewSet(
3360
JsonSchemaViewSet,
@@ -46,39 +73,15 @@ class OrderAdminViewSet(
4673
.filter(models.Exists(OrderProductRelation.objects.filter(order=models.OuterRef("pk"))))
4774
.select_related_with_user("user", "customer_info")
4875
.prefetch_related(
49-
models.Prefetch(
50-
"products",
51-
queryset=OrderProductRelation.objects.filter_active()
52-
.select_related("product")
53-
.prefetch_related(
54-
models.Prefetch(
55-
"options",
56-
queryset=OrderProductOptionRelation.objects.filter_active().select_related(
57-
"product_option_group",
58-
"product_option",
59-
),
60-
),
61-
),
62-
),
63-
models.Prefetch(
64-
"payment_histories",
65-
queryset=PaymentHistory.objects.filter_active().order_by("-created_at"),
66-
),
76+
models.Prefetch("products", queryset=_OPR_PREFETCH_QS),
77+
models.Prefetch("payment_histories", queryset=_PAYMENT_HISTORY_PREFETCH_QS),
6778
)
6879
.annotate(
6980
current_status=PaymentHistory.objects.latest_per_order_field("status"),
7081
latest_imp_id=PaymentHistory.objects.latest_per_order_field("imp_id"),
7182
latest_price=PaymentHistory.objects.latest_per_order_field("price"),
72-
first_paid_at=models.Subquery(
73-
PaymentHistory.objects.filter(order_id=models.OuterRef("pk"))
74-
.order_by("created_at")
75-
.values("created_at")[:1]
76-
),
77-
status_changed_at=models.Subquery(
78-
PaymentHistory.objects.filter(order_id=models.OuterRef("pk"))
79-
.order_by("-created_at")
80-
.values("created_at")[:1]
81-
),
83+
first_paid_at=_payment_history_created_at_subquery(latest=False),
84+
status_changed_at=_payment_history_created_at_subquery(latest=True),
8285
)
8386
.order_by("-created_at")
8487
)

0 commit comments

Comments
 (0)