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 に答える
0

queryset は何も返さないと確信しています。おそらく、 を使用して確認し./manage.py shell、 の内容を確認できridersます。

于 2012-04-30T03:02:59.243 に答える