0

こんにちは私はDjango関数を持っています:

def get_spans(angle):
    spans = Spans.objects.values_list('span').filter(
        max_roof_angle=angle,
    )
    try:
        max_span = max(spans)
    except ValueError:
        max_span = 0
    return max_span

私の質問は-なぜこれがタプルを返すのですか?単一の整数値を確実に取り戻すにはどうすればよいですか?

どんな助けでも大歓迎です。

4

3 に答える 3

2

ドキュメントから:arg flat=Trueを使用してフラットリストを取得できます。リストから最大値を取得しようとすると、必要な単一の値が取得されます

def get_spans(angle):
    spans = Spans.objects.values_list('span', flat=True).filter(
        max_roof_angle=angle,
    )
    max_span = max(spans)
    return max_span
于 2012-11-16T01:00:32.273 に答える
1

Raunakは、を使用して整数を取得する方法についてすでに適切な答えを出しましたvalue_list()が、タプルを返す理由は、複数のフィールドをクエリできるようにするためだと付け加えたいと思いました。Pythonは単一要素のタプルをスカラーのように処理しないため、スカラーを返す場合と、タプルを返す場合は一貫性がありません。

ただし、最大値を取得するためのより良い方法は、集計を使用してデータベースに最大値を計算させることです。このようにdb_index=Trueして、モデルのスパンフィールドに追加し、DBにO(1)時間の最大値を計算させることができます。私は実際にそれをテストすることはできませんが、このようなものでうまくいくはずだと思います:

from django.db.models import Max
def get_spans(angle):
    return Spans.objects.filter(max_roof_angle_exact=angle).aggregate(Max('span'))['span__max']
于 2012-11-16T01:12:57.313 に答える
0

あなたはできるreturn max_span[0]

空のタプルではないことを確認することをお勧めします。したがって、適切な例外処理も行います。

于 2012-11-16T01:00:45.123 に答える