django - Django:为相关对象生成查询集,同时保留注释
问题描述
我有一个复杂的数据模型,其中涉及两个相关模型,如下所示:
class A(Model):
b = ForeignKey(B)
... # does not matter
class B(Model):
... # does not matter
def myquery() -> QuerySet:
qs = A.objects.filter(...).annotate(x=...)
# The above is 46 LOC long in reality.
# I want to return the corresponding Bs
# plus the annotation x again, as a queryset.
我正在编写一个产生QuerySet
对象B
的函数。我编写了复杂的 46 行代码,这些代码生成了一个带有重要注释QuerySet
的正确对象,我需要将其保留在结果中。A
x
剩下要做的就是转换查询集,使其返回相应的B
对象(对象一对一A
)并x
重新附加注释。
如何?
解决方案
真他妈复杂...
这似乎是这样做的:
# from django.db.models import OuterRef, Subquery
# requires Django 1.11
b_ids = qs.values_list('b', flat=True)
this_x = qs.filter(b=OuterRef('pk')) \
.values_list('x', flat=True)
return B.objects.filter(pk__in=b_ids) \
.annotate(x=Subquery(this_x))
不太漂亮。有更好的解决方案吗?
(PS:最糟糕的部分是 Django 文档很难找到这个解决方案。它在某个地方包含所有相关信息,但是组织得很糟糕,而且通常过于隐含的 wrt 类型不符合我的口味。)
推荐阅读
- excel - 匹配包含重复单元格的行
- javafx - 在嵌入式 AWT 窗口启动之前,Javafx 禁用链接不会禁用链接
- wpf - ListCollectionView 使用 MVVM 模型过滤 DataGrid
- python - Pandas 中的嵌套 JSON 扁平化
- sql - 通用 SQL 问题(大查询) - 在每个客户不同的日期之后删除行
- r - R PDF Graphics Device 损坏的 PDF
- java - 如果使用自定义关闭方法(java 6),如何避免声纳错误“使用 try-with-resources 或在“finally”子句中关闭这个......”?
- c - 为什么我的文件处理(.txt 文件)搜索功能不起作用?
- algorithm - 在文件中搜索有序系列
- javascript - Angularjs Google Chart - 如何在绘制图表之前等待数据