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