我有一个复杂的数据模型,涉及两个相关的模型,如下所示:
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.
我正在编写一个生成B
对象QuerySet
的函数。 我已经编写了复杂的 46 行代码,这些代码生成了恰到好处的A
对象的QuerySet
,并带有重要的注释x
,我需要将其保留在结果中。
剩下要做的就是转换查询集,使其返回相应的B
对象(A
对象的 1 比 1(,并重新附加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 类型,不适合我的口味。