2828ADMIN_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 })
3259class 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