Django按一个字段分组,而另一个按最大值

时间:2020-08-23 07:37:28

标签: python-3.x django

我有这个模型:

class Order(models.Model):
    symbol = models.CharField(max_length=30, default='')
    b_id =  models.IntegerField(null = True, blank = True, unique=True)

我用它来存储从api获得的交易所产生的交易订单

我通常收到的订单如下:

#order1 (symbol='btc/usdt', b_id =1)
#order2 (symbol ='btc/usdt, b_id=2)
#order3 (symbol = 'eth/usdt', b_id=8)
#order4 (symbol = 'eth/usdt', b_id=9)
#b_id is unique id I get from exchange

要获得正确的订单历史记录,我需要获取按符号分组的最大b_id的订单

所以我需要返回对象的函数,例如: result = {'btc/usdt': 2, 'eth/usdt': 9}

现在我只使用简单的循环:

symbols=['btc/usdt', 'eth/usdt','link/usdt']

for symbol in symbols:
    last_order = Order.objects.filter(symbol=symbol).latest('b_id')       
    since = last_order.b_id
    sinces[symbol]=since

但是它经常查询数据库。有什么想法可以减少数据库调用吗?

UPD:看我有订单列表,它们按符号分组,例如我有五个BTC/USDT订单和六个ETH\BTC订单。 每个订单都有唯一的b_id 字段。

要从API获取正确的订单历史记录,我只需要知道最新(或最大)b_id的订单

例如,如果我有两个订单“ BTC \ USDT”

order1 (symbol='btc/usdt', b_id =1)
order2 (symbol ='btc/usdt, b_id=2)

我只需要选择一个带有b_id=2的符号,以及其他带有相同符号的符号

1 个答案:

答案 0 :(得分:1)

按预期方式投射values_list

from django.db.models import Max
qs = Order.objects.values('symbol').annotate(max_id=Max('b_id'))\
    .values_list('symbol', 'max_id')
result = {k:v for k,v in qs}
print(result)