2012-04-30 2 views
3

저는 django에 newb입니다. queryset이 ​​어떤 값을 반환하는지 확인하고 그렇지 않으면 루프의 다음 항목으로 건너 뜁니다. 나는 시도했다. .. 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이 반환되고 for 루프는 절대 입력되지 않습니다. 당신이 정말로 원하는 경우

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가 대답 한대로 queryset이 ​​아무것도 반환하지 않으면 루프가 입력되지 않습니다. 반면에 필터가 반환 할 레코드 수를 실제로 알고 싶다면 count() 메서드를 호출하면됩니다. CarAssignment.objects.filter(leg=leg).count() 그러면 레코드를 검색하지 않고 백그라운드에서 SELECT COUNT(*)을 수행합니다.

자세한 내용은 here을 참조하십시오.

+0

DB에 두 번 치지 않으면 안됩니다. 한 번 카운트 한 다음 count> 0 인 경우 두 번째로 원하는 레코드를 검색해야합니까? 멀리 볼 때, 그는 try ... except 블록을 제외하고 Timmy가 말한대로 따라야합니다. –

0

저는 queryset이 ​​아무것도 반환하지 않는다고 확신합니다. ./manage.py shell을 사용하여 확인한 다음 riders을 확인하십시오.

관련 문제