我想基于模型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
进行注释,但我希望在关联的最老B
每B
个A
。
答案 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)