优化通用模型的django选择查询

时间:2017-03-28 10:37:16

标签: python django django-models

我有一个通用模型“EmailedItem”引用模型“Item”。

我想循环浏览我的项目列表并打印发送电子邮件的时间。

现在我在做:

items = Item.objects.all()
for item in items:
    emailedItem = EmailedItem.objects.get(object_id=item.item_id)
    print emailedItem.created

问题是这个例程需要很快运行,并且需要花费大量时间对数据库中的每个项目进行选择。

有更好的方法吗?

非常感谢,

2 个答案:

答案 0 :(得分:0)

使用only仅选择查询中的指定字段(包括Item和EmailedItem)

答案 1 :(得分:0)

编辑回答纪念

使用values_list创建ID列表,然后按__in

进行查询
items = Item.objects.all()
dict_of_emailtedItems = {i.object_id: i for i in EmailedItem.objects.filter(object_id__in=items.values_list('item_id', flat=True))}
for item in items:
    emailedItem = dict_of_emailtedItems[item.id]
    print emailedItem.created

这将只生成2个查询到DB而不是1 + N,其中N是items的数量