【问题标题】:Queryset equivalent of SQL相当于 SQL 的查询集
【发布时间】:2012-04-29 17:53:08
【问题描述】:

我正在尝试提高这段代码的性能:

orderitems = OrderItem.objects.filter(order__contact=contact)
for orderitem in orderitems:

    try:
        pv = ProductVariation.objects.get(product=orderitem.product)

        if pv.parent_id == parent_product.id:
            return True
    except:
        pass

基本上我想摆脱'for'循环,因为它很慢。如果可能的话,我想使用单个查询集来完成它,但我无法理解语法。这是我想要重现的 SQL。它创建了一个相当短的列表,因此我可以遍历该列表以查找匹配项:

SELECT parent_id
FROM configurable_productvariation
WHERE product_id IN (
    SELECT product_id
        FROM shop_orderitem
        WHERE order_id
        IN (
            SELECT id
            FROM shop_order
            WHERE contact_id = 4));

“4”是python第一行中提到的“联系人”。

非常感谢, 托马斯

【问题讨论】:

  • 顺便说一句,我认为您的 python 示例与 sql 查询不对应。你确定return True

标签: django satchmo


【解决方案1】:

这应该会生成像你这样的 sql

product_ids = OrderItem.objects.filter(order__contact=contact).values_list('product_id', flat=True)
ProductVariation.objects.filter(product_id__in=product_ids)

【讨论】:

  • 感谢 San4ez!这解决了我的问题:) 我只需要做一些小改动。它变成了这样:product_ids = OrderItem.objects.filter(order__contact=contact).values_list('product', flat=True)ProductVariation.objects.filter(product__in=product_ids) b> 我不知道为什么 product_id 必须成为产品,但它确实有效。
猜你喜欢
  • 2015-12-23
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多