django - Django基于M2M关系上的多个字段注释多个对象
问题描述
我想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))
这用与 相关的所有sA
中相同的最旧名称来注释each ,但我希望每个 s 的关联s 中最旧的名称。B
B
A
B
B
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)
推荐阅读
- c++ - 重叠 Boost 协程的异常安全
- sql - 如何在 Teradata 中按等级(而不是行)计算滚动平均值?
- sql-server - 从其他数据库复制数据与直接查询它 SQL-Server
- laravel - Laravel hasMany 关系分离所有
- r - 使用 Quantmod 从雅虎财经下载数据失败
- html - IE下拉菜单自动打开
- angular - 无法使用 MatSort 对 mat-table 进行排序
- java - 我的 selenium 中打开了两个 Firefox 浏览器窗口
- discord.py - 如何在 Discord.py 中为网站制作项目通知器?
- docker - 如何将 Kubernetes configmap 复制到 pod 的可写区域?