我想高效地注释模型 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
s 相关 A
,但我想要最老的 B
其中关联B
s 每个 A
.
最佳答案
您忘记设置 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)
关于Django基于M2M关系上的多个字段注释多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998274/