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到模型中的跨度字段,并让数据库在 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 回答