您好我有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
我的问题是 - 为什么这会返回一个元组?我如何确保获得单个整数值?
任何帮助都非常感激。
答案 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]
我建议检查它不是一个空元组。所以也要进行适当的异常处理。