查询集优化

2024-04-28 09:51:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到序列号和对象列表之间的匹配,每个对象都有一个序列号:

型号:

class Beacon(models.Model):
    serial = models.CharField(max_length=32, default='0')

首先我写道:

 for b in Beacon.objects.all():
      if b.serial == tmp_serial:
           # do something
           break

然后我向前走了一步:

b_queryset = Beacon.objects.all().filter(serial=tmp_serial)
     if b_queryset.exists():
         #do something

现在,是否还有第二步需要进一步优化?你知道吗

我不认为把我的查询集放到一个列表中做一个列表.索引('tmp\u serial')。你知道吗


Tags: 对象列表ifobjectsmodelsserialalldo
2条回答

我认为你是最好的,但如果你只是想知道对象是否存在

来自django queryset exists()https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.exists

 if Beacon.objects.all().filter(serial=tmp_serial).exists():
      # do something

如果序列号是唯一的,则可以执行以下操作:

# return a single instance from db
match = Beacon.objects.get(serial=tmp_serial)

如果您要用同一序列获取多个对象,并计划对每个对象执行某些操作,那么exist将添加一个无用的查询。 相反,您应该:

matches = Beacon.objects.filter(serial=tmp_serial)

if len(matches) > 0:
    for match in matches:
        # do something

这里的技巧是len(matches)将强制对queryset进行求值(因此您的db将被查询)。之后, 将检索模型实例,您可以在不进行其他查询的情况下使用它们。你知道吗

但是,当您使用queryset.exists()时,ORM会运行一个非常简单的查询来检查queryset是否会返回任何元素。 然后,如果迭代查询集,则运行另一个查询来获取对象。详见the related documentation。你知道吗

总而言之:use仅在您希望检查queryset是否返回结果时才存在。如果您确实需要queryset数据,请使用len()。你知道吗

相关问题 更多 >