2012-04-30 31 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是什麼。

相關問題