6

我是 Django 的新手。我需要检查查询集是否返回任何值,如果没有,则跳到循环中的下一项。我试过尝试.. 除了 ObjectDoesNotExist 并且那不起作用。如果过滤器没有找到任何东西,它会返回什么?我如何检查它?

这是现有的代码:

def assign_family_riders(leg):
    remaining_leg_riders = list(leg.riders.all())
    for car in CarAssignment.objects.filter(leg=leg):
        driver_family = car.driver.family
        try:
            riders = leg.riders.all().filter(family=driver_family)
        except ObjectDoesNotExist:
            continue
        for rider in riders:
            car.riders.add(rider)
            remaining_leg_riders.remove(rider)
    return remaining_leg_riders
4

4 回答 4

12

您不需要专门检查。如果过滤器没有返回任何对象,将返回一个 EmptyQuerySet 并且永远不会进入 forloop。

riders = leg.riders.filter(family=driver_family)
for rider in riders:
    ...

如果你真的想,你可以简单地做:

riders = leg.riders.filter(family=driver_family)
if riders:
    for rider in riders:
        ...

仅当ObjectDoesNotExist您尝试使用以下方式检索特定记录时才会引发异常get()

try:
     rider = leg.riders.get(...)
except Rider.DoesNotExist:
    ...
于 2012-04-30T01:35:00.120 回答
2

正如蒂米在他的回答中所说,如果查询集没有返回任何内容,则不会进入您的循环。另一方面,如果您真的想知道过滤器将返回的记录数,您可以调用它的count()方法:CarAssignment.objects.filter(leg=leg).count() 这会在后台为您执行一个SELECT COUNT(*)而不检索任何记录。

请参阅此处了解更多信息。

于 2012-04-30T02:00:19.447 回答
1

最有效的方法是exists()在迭代查询集之前使用查询集或执行任何其他可能与数据库执行更密集交互的操作。

文档中的一个例子;

查找具有唯一字段(例如primary_key )的模型是否是QuerySet成员的最有效方法是:

entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
    print("Entry contained in queryset")

这将比以下需要评估和迭代整个查询集更快:

if entry in some_queryset:
   print("Entry contained in QuerySet")
于 2019-12-04T21:47:06.297 回答
0

我很确定查询集什么都不返回。您可能可以使用./manage.py shell然后查看其中的内容来检查它riders

于 2012-04-30T03:02:59.243 回答