如何从Django queryset中提取数值?

时间:2018-08-21 17:11:54

标签: django django-models django-queryset

我觉得这是一个非常简单/愚蠢的问题,但是对于我的一生,我无法弄清楚。我正在尝试从查询集中提取一个整数,以便可以将其与数学运算符一起使用。我所能得到的只是查询集,而不是实际的号码...

:FacePalm:

var mytext = 'Hello :smile: and jolly :wave:';
var matches = mytext.match(/:([a-z0-9]+):/gmi);
// matches = [':smile:', ':wave:'];

如何从查询集中获取实际数字,以便可以使用?

编辑:我对我实际上想使用Max()函数做的事情更加清楚。相同帐户名称的多个对象可以具有不同的帐号。我想要该列表中的最大数量,然后向其中添加一个。

3 个答案:

答案 0 :(得分:1)

请记住,一个QuerySet可能包含多个结果。如果确定只需要第一个contract_number,请按索引0访问它:

number = Contract.objects.filter(account="xyz").values_list('contract_number', flat=True)[0]

答案 1 :(得分:1)

您可以使用方法first并获得attr contract_number

Contract.objects.filter(account="xyz").order_by('contract_number').first().contract_number + 1

并排除未找到Contract的异常,您可以这样做:

contract = Contract.objects.filter(account="xyz").order_by('contract_number').first()
contract_number = contract.contract_number + 1 if contract else 1

阅读文档querysets first

或简单地使用aggregation中的Max

from django.db.models import Max
max_agg = Contract.objects.filter(account="xyz").aggregate(max_num=Max('contract_number'))
contract_number = max_agg.get('max_num', 1)

答案 2 :(得分:1)

基于修订后的问题的另一个答案:

next_contract_number = (
    Contract.objects.filter(account="xyz")  # Filter like usual...
    .aggregate(num=Max("contract_number"))  # Create an aggregation, so we get a dict out . . .
    .get("num")  # ... that we get `num` (the kwarg from above) out; but it may be None, so ...
    or 0  # ... use the fact that `None` is falsy to default to zero . . . 
) + 1  # and add one.