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

Django基于M2M关系上的多个字段注释多个对象,django,annotations,many-to-many,Django,Annotations,Many To Many,我想基于ModelB上的一些字段有效地注释ModelA对象,这些字段与A之间存在简单的多对多关系(不使用直通模型)。一个问题是,我必须为每个A(使用B.created\u timestamp)找到最早的B,然后使用B.name填充。我想使用ORM而不是原始SQL 我试过这个,但不正确: a_qs = A.objects.filter(id__in=ids) ordered_qs = a_qs.order_by('-b__created_timestamp') oldest_qs = Subque

我想基于Model
B
上的一些字段有效地注释Model
A
对象,这些字段与
A
之间存在简单的多对多关系(不使用直通模型)。一个问题是,我必须为每个
A
(使用
B.created\u timestamp
)找到最早的
B
,然后使用
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
中为每个
A
设置
OuterRef


这是一个很难解决的问题。你需要完成
B
对象还是只需要它的一些字段?你只需要每个
A
中最早的
B
的名称?是的,这是正确的。我找到了一个黑客解决方案,我在
A
上注释了
B.created\u timestamp
B.name
,然后在
A
上进行分组Python(b/c它为每个M2M关系返回一个不同的结果)。我更希望能用ORM来做。你们有定义的直通表吗?我想如果你这样做的话是可能的
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)