【发布时间】:2018-02-20 04:17:27
【问题描述】:
我正在编写一个脚本,它需要遍历数十万个模型。模型对象并(取决于是否存在空白=True,null=True ForeignKey 字段)执行某些操作。
给定以下代码:
class RelatedItem(models.Model):
name = models.TextField()
class Item(models.Model):
related_item = models.ForeignKey(RelatedItem)
items = Item.objects.all()
for item in items:
if item.related_item:
# Do stuff
我知道 item.related_item 将触发数据库查找。为了避免这种情况,我想知道是否可以这样做:
items = Item.objects.all()
for item in items:
if item.related_item_id:
# Do stuff
item.related_item_id 是否仍会触发数据库调用,或者该字段是否存储在模型中,因此可能运行得更快?
编辑:注意,我什至不想使用related_item,所以我认为我不需要使用 select_related 或预取任何东西。也就是说,如果数据库查找是不可避免的,并且这也会加快我的查询速度(并且不会因为预取 100k 项而拖累我的机器内存)我也可以这样做。
编辑 2:我也无法将初始查询集从 Item.objects.all() 更改为 Item.objects.filter(related_item__isnull=False)。我下面的例子是一个简化,但是完整的函数需要遍历数据库中的所有对象,不管是否设置了related_item。我知道这意味着我无法避免对 Item 对象进行数据库查找,但我希望避免对 item.related_item 对象进行二次查找(如果我不需要)。
【问题讨论】:
标签: django django-models