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

Django slow query since unable to use related set

我使用的是 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 环境中工作的人(机器并不慢)并且到目前为止数据库真的很小,我认为这很多,因为只有 269 个 PurchaseOrder 记录,396 个 PurchaseOrderLine 记录和 726 个 ProductProduct 记录。

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

如果不能帮到您,抱歉

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

看看conditional expressions