brunch
매거진 백엔드

Django Model - 쿼리 최적화 2

#Subquery #OuterRef

by 내가 사는 세상

모델 상황

class User(models.Model):

name = models.CharField(max_length=100)


class Order(models.Model):

user = models.ForeignKey(User, on_delete=models.CASCADE)

product_name = models.CharField(max_length=100)

created_at = models.DateTimeField()


스크린샷 2025-03-31 오후 12.26.28.png
스크린샷 2025-03-31 오후 12.50.06.png




모델에서 데이터 깔끔하게 가져오기 #쿼리 최적화 #Subquery, OuterRef


Subquery()의 인자는 qs(query set)가 들어가야함

예시) OuterRef('pk') : User 개체의 pk를 내부 쿼리에서 참조


모든 유저의 "가장 최근 주문" 가져오기


from django.db.models import Subquery, OuterRef



latest_order = Order.objects.filter(

user=OuterRef('pk')

).order_by('-created_at').values('product_name')[:1]


users = User.objects.annotate(

latest_product=Subquery(latest_order)

)




스크린샷 2025-03-31 오후 12.50.40.png


실제 사용되는 SQL문



















keyword
매거진의 이전글[백엔드, Django] 인증방식