我有这个模型:
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
的符号,以及其他带有相同符号的符号
答案 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)