Django慢查询,因为无法使用相关集

时间:2017-05-31 03:22:33

标签: django foreign-keys query-performance

我使用的是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)

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

我无法过滤使用" 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 recs,396 PurchaseOrderLine recs和726 ProductProduct recs。

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

2 个答案:

答案 0 :(得分:0)

很抱歉,如果它不能帮助你

# 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)

答案 1 :(得分:0)