Django 查询集获取每个唯一属性值的最新值

标签 django django-queryset

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/

相关文章:

django - 如何获取在Django模型中自动生成的主键ID

django - 如果 DJango 中需要登录,如何获取请求

javascript - 如何使用 dajax/dajax-ice 填充 div?

python - 如何将索引添加到 auth_user 模型 django

python - 如何使用 Django 的数据库 API 构建嵌套查询

django - 查询集排序 : Specifying column collation for django ORM query

django - 在 Django 中选择不同的单个列?

Java、Code Igniter、RoR、DJango Web 应用程序挑战

python - 如果对象存在,我如何获取它,或者如果它在 Django 中不存在,我如何获取它?

django - 具有过滤查询集的组权限自定义表单