2012-04-30 11 views
3

私はdjangoのnewbです。クエリーセットが値を返すかどうかをチェックし、そうでなければ、ループ内の次の項目にスキップする必要があります。私は試してみました.. 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: 
    ... 

あなたが本当にしたい場合は、単に行うことができます:あなたはget()を使用して、特定のレコードを取得しようとしているとき

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

ObjectDoesNotExist例外がのみ発生します

try: 
    rider = leg.riders.get(...) 
except Rider.DoesNotExist: 
    ... 
2

ティミーが答えてくれたように、クエリーセットが何も返さなければループは入力されません。一方、フィルタが返すレコードの数を実際に知りたい場合は、メソッドを呼び出すことができます。CarAssignment.objects.filter(leg=leg).count() これは、レコードを取得せずに、SELECT COUNT(*)をバックグラウンドで実行します。

詳細については、hereを参照してください。

+0

DBに2回、1回カウントした後にcount> 0、2回目に目的のレコードを取得しなければならないと思いませんか?見ている限り、彼は試しを必要としません...ブロックを除き、ティミーが言ったように続きます。 –

0

私は確かにquerysetは何も返しません。 ./manage.py shellを使用して確認してから、ridersの内容を確認してください。

関連する問題