簡體   English   中英

Django prefetch_related多個查詢

[英]Django prefetch_related multiple queries

我正在使用prefetch_related來連接三個表。 產品,ProductPricesProductMeta。 但除了我關注文檔之外,調試器還說我使用了三個查詢而不是一個(帶連接)

這也產生了第二個問題。 有些產品在某些國家沒有價格,因為它們在那里不具備價格 但是使用此代碼,產品會顯示但價格為空。

所以, 我想排除沒有價格或元的產品 我做錯了什么?

這是我的代碼:

prefetch_prices = Prefetch(
    'product_prices',
    queryset=ProductPrices.objects.filter(country=country_obj),
    to_attr='price_info'
)

prefetch = Prefetch(
    'product_meta',
    queryset=ProductMeta.objects.filter(language=lang),
    to_attr='meta_info'
)

products = Product.objects.prefetch_related(prefetch, prefetch_prices).all()

這產生了這些SQL查詢:

{   'sql': 'SELECT DISTINCT `products`.`id`, `products`.`image`, '
               '`products`.`wholesale_price`, `products`.`reference`, '
               '`products`.`ean13`, `products`.`rating`, `products`.`sales`, '
               '`products`.`active`, `products`.`active_in`, '
               '`products`.`encilleria`, `products`.`delivery`, '
               '`products`.`stock`, `products`.`ingredients`, ' 
               'FROM `products` WHERE `products`.`active` = 1 ',
        'time': '0.098'},
    {   'sql': 'SELECT `products_meta`.`id`, `products_meta`.`product_id`, '
               '`products_meta`.`name`, `products_meta`.`slug`, '
               '`products_meta`.`tagline`, `products_meta`.`key_ingredients`, '
               '`products_meta`.`ideal_for`, `products_meta`.`description`, '
               '`products_meta`.`advice`, `products_meta`.`summary`, '
               '`products_meta`.`language` FROM `products_meta` WHERE '
               "(`products_meta`.`language` = 'en' AND "
               '`products_meta`.`product_id` IN (52001, 51972, 52038, 52039, '
               '52040, 52041, 51947, 51948, 51949, 51950, 51951, 51953, 51954, '
               '51832))',
        'time': '0.096'},
    {   'sql': 'SELECT `products_prices`.`id`, `products_prices`.`product_id`, '
               '`products_prices`.`country_id`, `products_prices`.`price` FROM '
               '`products_prices` WHERE (`products_prices`.`country_id` = 1 '
               'AND `products_prices`.`product_id` IN (52001, 51972, 52038, '
               '52039, 52040, 52041, 51947, 51948, 51949, 51950, 51951, 51953, '
               '51954, 51832))',
        'time': '0.046'}

謝謝

來自prefetch_related文檔

返回一個QuerySet,它將在一個批處理中自動檢索每個指定查找的相關對象。

從以下說明中可以看出

另一方面, prefetch_related對每個關系進行單獨查找,並在Python中進行“連接”。

prefetch_related將對每個表執行查詢並在python中合並它們

另外,如果你有外鍵而不是很多,你可以使用select_related

正如@iklinac所說, prefetch_related將執行多個查詢並確定結果。

但是如果你想“排除空行”或像INNER JOIN這樣的功能,你可以這樣做:

你可以這樣做:

a = ProductPrices.objects.filter(country=country_obj)
prefetch1 = Prefetch(
    'product_prices',
    queryset=a,
    to_attr='price_info'
)

b = ProductMeta.objects.filter(language=lang)
prefetch2 = Prefetch(
    'product_meta',
    queryset=b,
    to_attr='meta_info'
)

products = products.prefetch_related(prefetch1, prefetch2)
products = products.filter(id__in=a.values_list('product_id'))
products = products.filter(id__in=b.values_list('product_id'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM