Django 연관관계 조회 시 동일 객체(pk) 여러 개 조회되는 문제

River Kim·2022년 4월 12일
0

Product, ProductStock 의 관계는 1:N 관계

다음과 같은 데이터가 있고
ProductStock의 정보를 통해 Product를 조회해야할 경우
Django의 매핑된 연관관계를 통해 조회할 수 있다.

product_idproduct_stock_id
10011
10012
10013

주어진 데이터는 ProductStock ID만 있다고 가정하고
ProductStock ID 로 Product 를 조회하려고 한다.

product_stock_ids = [11, 12, 13]

# product_stock.id 리스트로 ProductStock queryset 조회
product_stocks = ProductStock.objects(id__in=product_stock_ids)
print(product_stocks)
# <QuerySet [<ProductStock: ProductStock object (11)>, ProductStock object (12)>, ProductStock object (13)>]>

# product_stock.id 리스트로 Product 조회
products = Product.objects.filter(product_stocks__id__in=product_stock_ids)
print(products)
# 100번 상품이 세번 조회된다. queryset의 쿼리를 출력해보면 product 테이블과 product_stock 테이블을 inner join 하고 있기 때문
# <QuerySet [<Product: Product object (100)>, <Product: Product object (100)>, <Product: Product object (100)>]>

ProductStock의 ID로 하나의 Product만 조회하려면
위에서 조회한 ProductStock queryset(product_stocks)을 이용하여 Product의 id 리스트를 추출할 수 있고, 추출한 Product id 리스트로 in 조회를 할 수 있다.

product_ids = product_stocks.values_list('product_id', flat=True)
print(product_ids)
# [100, 100, 100]

print(set(product_ids)) # 이런식으로 한번 중복을 제거한 후 id in 조회를 할 수도 있다.
# (100)

products = Product.objects.filter(id__in=product_ids)
print(products)
# <QuerySet [<Product: Product object (100)>]>
profile
언제까지 개발자로 살 수 있을까..

0개의 댓글