Django / Python - list的max()返回一个元组

时间:2012-11-16 00:57:35

标签: python django

您好我有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

我的问题是 - 为什么这会返回一个元组?我如何确保获得单个整数值?

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:2)

the documentation:您可以使用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

答案 1 :(得分:1)

Raunak已经给出了如何使用value_list()获取整数的正确答案,但我想我可能会补充说它返回元组的原因是你可以查询多个字段。因为Python不像处理标量那样处理单元素元组,所以在某些情况下返回标量而在其他情况下返回元组则不一致。

但是,获得最大值的更好方法是让数据库使用aggregation为您计算。这样,您可以将db_index=True添加到模型中的span字段,并让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']

答案 2 :(得分:0)

你可以return max_span[0]

我建议检查它不是一个空元组。所以也要进行适当的异常处理。