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

标签 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 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/

相关文章:

jsf - Spring Security jsf - 成功登录后登录表单重定向到相同的登录页面

python - Django 在 ModelForm 的 "other"模型上包含 ManyToManyField

python - Django 会自动检测最终用户的时区吗?

django - 如何加入具有同一用户外键的多个模型的结果?

python - sqlite3.OperationalError : unable to open database file

行为附加到注释的 Java 设计问题

ios - 如何向 MKPointAnnotation 添加按钮并打开 map ?

sql - has_many :through multiple has_one relationships?

hibernate - JPA 是否支持 @ManyToMany(mappedBy = ... ) + @OrderColumn?

python - 如何在 Django URL 模式中使用小数?