首页 > 解决方案 > Django基于M2M关系上的多个字段注释多个对象

问题描述

我想A根据模型上的某些字段有效地注释模型对象,这些字段B具有简单的多对多关系(不使用直通模型)到A. 一个问题是我必须B为每个A(使用B.created_timestamp)找到最旧的,然后使用B.name. 我想使用 ORM 而不是原始 SQL。

我试过这个,但它不正确:

a_qs = A.objects.filter(id__in=ids)
ordered_qs = a_qs.order_by('-b__created_timestamp')
oldest_qs = Subquery(ordered_qs.values('b__name')[:1])
result = list(a_qs.annotate(name=oldest_qs))

这用与 相关的所有sA中相同的最旧名称来注释each ,但我希望每个 s 的关联s 中最旧的名称。BBABBA

标签: djangoannotationsmany-to-many

解决方案


你忘了设置OuterRef https://docs.djangoproject.com/en/2.2/ref/models/expressions/

b_qs = B.objects.filter(a=OuterRef('pk')).order_by('-created_timestamp')
a_qs = A.objects.filter(id__in=ids).annotate(oldest_name=Subquery(b_qs.values('name')[:1])
result = list(a_qs)

推荐阅读