Django基于M2M关系中的多个字段注释多个对象

时间:2019-07-11 22:55:51

标签: django annotations many-to-many

我想基于模型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))

这会在与A相关的所有B中为每个B用最古老的名称A进行注释,但我希望在关联的最老BBA

1 个答案:

答案 0 :(得分:0)

您忘记设置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)