【问题标题】:Django slow query since unable to use related setDjango慢查询,因为无法使用相关集
【发布时间】:2017-10-31 16:28:21
【问题描述】:

我使用的是 1.8 版

class ProductProduct(models.Model):
    product_tmpl = models.ForeignKey(ProductTemplateModel)
    default_code = models.CharField()
    name_template = models.CharField()
    ...

class PurchaseOrder(models.Model):
    # fields...

class PurchaseOrderLine(models.Model):
    id = models.IntegerField()
    product_id = models.ForeignKey(ProductProduct)
    order_id = models.ForeignKey(PurchaseOrder)

我只需要列出 default_code(在 ProductProduct 模型中)为空的 PurchaseOrder 记录。

我无法使用“purchaseorderline_set.product_id_set.default_code=None”进行过滤 因为 purchaseorderline_set 是一个查询集,它没有属性 product_id_set 如here 所示。所以我尝试使用这个:

orders_recs = PurchaseOrder.objects.all().order_by('-id')
orders_recs = PurchaseOrder.objects.filter(purchaseorderline_set.product_id_set.default_code=None).order_by('-id')
orders = []
for order_rec in orders_recs:
    line = order_rec.purchaseorderline_set.all()
    if line and line[0].product_id.default_code == None:
        orders.append(order_rec)

但它需要超过 3 秒。考虑到我只是一个在我的 DEV 环境中工作的人(机器并不慢)并且 DB 到目前为止非常小,因为只有 269 个 PurchaseOrder 记录、396 个 PurchaseOrderLine 记录和 726 个 ProductProduct 记录,我认为这很多。

我想有一种我没有看到的有效方法。

【问题讨论】:

    标签: django foreign-keys query-performance


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      如果对您没有帮助,请见谅

      # pp:ProductProduct
      # po:PurchaseOrder
      # pol:PurchaseOrderLine
      # List PP with None
      pp = PP.objects.filter(def_c = None)
      # list pol have pp None
      pol = POL.objects.filter(prod__in = pp)
      # create a list ids of POL
      ids = []
      for i in pol: 
          ids.append(pol.order_id)
      po = PO.objects.filter(id__in = ids)
      

      【讨论】:

      • 嗨@Nam Nguyễn,我认为 pol_ids = POL.objects.filter(prod__in = pp).values_list('id', flat=True)
      • 是的,在查询中创建一个id列表更好。我只是展示另一种查询方式,不需要像上面那样做复杂的事情
      • 我刚刚使用了“values_list('id', flat=True)”的方法。现在它更快了!谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2016-02-21
      • 1970-01-01
      • 2016-09-03
      • 2012-02-20
      • 2016-03-25
      • 2023-03-12
      相关资源
      最近更新 更多