Python 如何根据最新ForeignKey中的字段值查询Django对象?

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):

我有一个Django应用程序来存储几个市场的每小时价格和数量(OHLCV蜡烛)。我试图实现的是比较所有市场的最新交易量,并将
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]
。然后我按列表元素0
volume
对嵌套列表进行排序,并选择前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()
按时间顺序按主键排序查询集。但我可能错了