Django基于M2M关系上的多个字段注释多个对象
我想基于ModelDjango基于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
B
上的一些字段有效地注释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 = 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)