class SwallowMigration(models.Model):
swallow = models.ForeignKey(Swallow)
date = models.DateTimeField(auto_now_add=True)
coconuts_carried = models.IntegerField()
如何获取每只燕子的最新迁徙信息?
当然,.latest() 只给我最新的条目。有没有办法(也许使用 Max 聚合?)来获取另一个字段中某个值的每个实例的最新信息?
最佳答案
如果仅拥有 Swallow 实例并且仅最近迁移的日期就足够了,那么以下内容应该可以为您做到这一点:
Swallow.objects.annotate(latest_migration=Max('swallowmigration__date'))
生成的查询集中的每个 Swallow 实例都将具有“latest_migration”属性,该属性将是相关对象的最大日期时间。
如果您确实需要 SwallowMigration 实例,则将花费您 N+1 次查询,其中 N 是 Swallow 实例的数量。尽管您将拥有 SwallowMigration 对象,每个对象上都有一个预取的 Swallow 实例,而不是相反,但类似下面的内容可以为您做到这一点。通过将 SwallowMigration 实例设置为 Swallow 实例的属性,处理该列表并反转它们并不困难。
qs = SwallowMigration.objects.values(
'swallow_id'
).annotate(
latest_migration=Max('date')
)
migrations = []
for vals in qs:
sm = SwallowMigration.objects.select_related(
'swallow'
).get(
swallow=vals['swallow_id'],
date=vals['date'],
)
migrations.append(sm)
可能(可能是)有一种方法可以在单个查询中返回您想要的所有数据,但它必须是原始 SQL,并且您必须按原样使用其中的数据或构建模型其中的实例。
如果要频繁执行此代码,则可能值得将 Swallow 上的外键添加到最新的 SwallowMigration,以便您可以使用 select_lated() 在单个查询中轻松检索它们。您只需确保在添加新的 SwallowMigration 实例时保持外键更新即可。
关于Django 查询集获取每个唯一属性值的最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5689505/