Product, ProductStock 의 관계는 1:N 관계
다음과 같은 데이터가 있고
ProductStock의 정보를 통해 Product를 조회해야할 경우
Django의 매핑된 연관관계를 통해 조회할 수 있다.
product_id | product_stock_id |
---|---|
100 | 11 |
100 | 12 |
100 | 13 |
주어진 데이터는 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)>]>