Python 针对通用模型优化django select查询

Python 针对通用模型优化django select查询,python,django,django-models,Python,Django,Django Models,我有一个引用模型“Item”的通用模型“EmailedItem” 我想循环查看我的邮件列表并打印电子邮件发送的时间 目前我正在做: items = Item.objects.all() for item in items: emailedItem = EmailedItem.objects.get(object_id=item.item_id) print emailedItem.created 问题是这个例程需要非常快地运行,并且需要花费大量时间在数据库中为每个项目进行选择

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

我想循环查看我的邮件列表并打印电子邮件发送的时间

目前我正在做:

items = Item.objects.all()
for item in items:
    emailedItem = EmailedItem.objects.get(object_id=item.item_id)
    print emailedItem.created
问题是这个例程需要非常快地运行,并且需要花费大量时间在数据库中为每个项目进行选择

有没有更好的办法


非常感谢,

用于仅选择查询中的指定字段(在Item和EmailedItem上)

编辑

创建具有
值的ID列表\u列表
,然后通过
\u在

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是
项的数量

由于
Item.objects.all()
,它不会在每次迭代中被命中,因为他在每次迭代中都执行
EmailedItem.objects.get(object_id=Item.Item_id)
。此问题是常见的N+1选择问题的一个示例。谢谢你的批改。我会更新我的回答谢谢,但我必须对我循环中的项目做其他事情。因此,我需要循环浏览我的项目列表,而不是我的EmailedItems列表。理想情况下,我会有一个字典,作为键,对应项的ID,作为值,创建的。多功能查询。。。所以在循环中,我可以很容易地做一些事情,比如dict_of_emailtedItems[item.id]@justinlevol查看更新的答案。另外,如果
EmailedItem
ForeignKey
Item
您可以只执行
EmailedItem.Item
,但不要忘记执行
选择相关('Item')
。谢谢您的回答。它确实有效,我提出了一个类似的解决方案,但不幸的是,它在性能方面没有帮助。