2016-08-22 16 views
0
class Order(models.Model): 
     # Some fields.. 
     status = models.IntegerField() 
     user = models.ForeignKey(User) 

ステータスフィールドは、4つの値を取得することができますが存在しますDjangoの複数の()は、集約

if in the queryset there is a row with status=1, return 1 
elif there's row with status=3, return 3 
elif there's row with status=4, return 4 
elif there's row with status=2, return 2 

この優先度(つまり、この順番では、スイッチケースの動作と同様です)。 特定のユーザーのためにそれらに照会して、いくつかの状況メッセージを表示します。したがって、次のようになるはずです。

Order.objects.filter(user=request.user) # ...? .aggregate() maybe ? 

そして、私はインジケータだけが必要で、注文オブジェクトは必要ありません。
dbレベルではCaseのようなものになると思いますが、私はdjangoで動作させることができませんでした。

EDIT:より良い説明すること、私はその

if Order.objects.filter(user=request.user, status=1).exists(): 
    return 1 
elif Order.objects.filter(user=request.user, status=3).exists(): 
    return 3 
elif Order.objects.filter(user=request.user, status=4).exists(): 
    return 4 
elif Order.objects.filter(user=request.user, status=2).exists(): 
    return 2 

ようにそれを行うことができます。しかし、明らかに、私は4つのクエリ..

答えて

1
order_statuses = Order.objects.filter(user=request.user).values_list('status', flat=True) 

ステータスの一覧が表示されます。

if 1 in order_statuses: 
    return 1 
elif 2 in order_statuses: 
    return 3 
elif 3 in order_statuses: 
    return 4 
elif 4 in order_statuses: 
    return 2 

このようにして、データベースの負荷を増やす代わりにDjangoサーバーで計算することができます。

2
Order.objects.annotate(order_status=models.Case(
    models.When(status=1, then=0), 
    models.When(status=3, then=1), 
    models.When(status=4, then=2), 
    models.When(status=2, then=3), 
    default=models.F('status'), 
    output_field=models.IntegerField(), 
),).aggregate(models.Min('order_status')) 

を行うことを避けるとマッピングのためのいくつかの辞書を必要としたい

をステータス
+0

を、私は、フィールドの数値に頼らない好みます。第2に、これは動作しません。たとえば、status = 3、status = 2の行が存在する場合は3が返されます。 – user3599803

0

あなたはこれを行うことができます。

# This will return a value of None, if no matching Order object exists, 
# or the lowest status that exists: 
return Order.objects.filter(
    user=request.user 
).order_by(
    'status' 
).values_list(
    'status', flat=True 
).first() 
関連する問題