2012-04-30 32 views
3

我是django的新手。我需要检查查询集是否返回任何值,如果不是,则跳到循环中的下一个项目。我试图尝试..除了ObjectDoesNotExist和那不工作。如果过滤器找不到任何东西,它会返回什么?我如何检查它?django - 检查过滤器是否返回查询集中的任何东西

这里的现有代码:

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 

回答

6

你并不需要专门检查。如果过滤器没有返回任何对象,则返回一个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: 
    ... 
2

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

有关更多信息,请参阅here

+0

难道你不认为他必须击中数据库两次,一次计数,然后如果计数> 0,第二次检索所需的记录?据他所知,他根本不需要try ... except block,并且按照Timmy的说法。 –

0

我很确定queryset什么也没有返回。你可以使用./manage.py shell来检查它,然后看看riders是什么。

相关问题