Python 如何根据最新ForeignKey中的字段值查询Django对象?
我有一个Django应用程序来存储几个市场的每小时价格和数量(OHLCV蜡烛)。我试图实现的是比较所有市场的最新交易量,并将Python 如何根据最新ForeignKey中的字段值查询Django对象?,python,django,Python,Django,我有一个Django应用程序来存储几个市场的每小时价格和数量(OHLCV蜡烛)。我试图实现的是比较所有市场的最新交易量,并将top10=True设置为最新交易量最高的10个市场。最有效的方法是什么 编辑:查询集应选择每个市场中所有最新的蜡烛,并按数量进行排序。然后返回前10支蜡烛所属的10个市场 型号.py class Market(models.Model): top10 = JSONField(null=True) class Candle(models.Model):
top10=True
设置为最新交易量最高的10个市场。最有效的方法是什么
编辑:查询集应选择每个市场中所有最新的蜡烛,并按数量进行排序。然后返回前10支蜡烛所属的10个市场
型号.py
class Market(models.Model):
top10 = JSONField(null=True)
class Candle(models.Model):
market = models.ForeignKey(Market, on_delete=models.CASCADE, related_name='candle', null=True)
price = models.FloatField(null=True)
volume = models.FloatField(null=True)
dt = models.DateTimeField()
我想我终于找到了解决办法
latest_distinct = Candle.objects.order_by('market__pk', '-dt').distinct('market__pk')
candle_top = Candle.objects.filter(id__in=latest_distinct).order_by('-volume')[:10]
for item in candle_top:
item.market.top10 = True
item.market.save()
latest\u distinct=Candle.objects.order\u by('market\u pk','-dt')。distinct('market\u pk')
将为每个市场选择最新的蜡烛记录。
candle\u top=candle.objects.filter(id\u in=latest\u distinct)。order\u by('-volume')[:10]
将按降序对上一次查询中的项目进行排序,并对10个最大的项目进行切片。
然后您将每个market.top10
设置为True
注意,我假设Market
的top10
字段是一个布尔值。您可以用自己的逻辑代替item.market.top10=True
我找到了解决我自己问题的方法,方法是用主键选择每个市场中的最后一根蜡烛,然后创建一个列表,列表元素为[volume,pk]
。然后我按列表元素0volume
对嵌套列表进行排序,并选择前10名。它返回所需市场的列表:
import operator
v = [[m.candle.first().volume, m.candle.first().id] for m in Market.objects.all()]
top = sorted(v, key=operator.itemgetter(0))[-10:]
[Candle.objects.get(id=i).market for i in [t[1] for t in top]]
嗨,大卫,谢谢你的建议,但这并没有过滤每个市场的最新蜡烛。我想做的是按体积对烛光进行排序,但只对所有市场的最新烛光进行排序。您能告诉我您使用的是哪个数据库吗?当然,我使用PostgreSql我已经找到了一个解决方案,创建了一个具有最新体积和烛光主键的列表。我想我已经找到了一个非常好的解决方案。我已经在一个小的django项目中测试了它。请检查它是否适合您并让我知道。如果我没有弄错的话,您的方式并不总是选择最新的,因为您正在调用m.candle
上的first()
,根据文档first()
按时间顺序按主键排序查询集。但我可能错了