首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django prefetch_related多重查询

Django prefetch_related多重查询
EN

Stack Overflow用户
提问于 2018-03-15 11:38:55
回答 2查看 8.8K关注 0票数 1

我使用prefetch_related连接三个表。产品, ProductPricesProductMeta。但是除了跟踪文档之外,调试器还说我使用的是三个查询,而不是一个(带有联接)。

这也造成了第二个问题。--有些产品在一些国家没有价格,,因为它们在那里是不可否认的。但是使用这个代码,产品就会出现,但是价格是空的。

所以,,我想排除那些没有价格或元的产品。我做错什么了吗?

这是我的密码:

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
{   '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'}

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-16 08:04:22

正如@iklinac所说,prefetch_related将执行多个查询并对结果进行标记。

但是,如果要“排除空行”或内部联接之类的功能,可以这样做:

代码语言:javascript
复制
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'))
票数 2
EN

Stack Overflow用户

发布于 2018-03-15 11:43:52

来自prefetch_related文档

返回一个QuerySet,它将在单个批处理中自动检索每个指定查找的相关对象。

你可以从下面的解释中看到

另一方面,prefetch_related对每种关系进行单独的查找,并在Python中进行“连接”。

prefetch_related将对每个表进行查询,并在python中合并它们。

此外,如果您有外键,而且不多,您可以使用select_related代替

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49298480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档