Django:在保留注释的同时为相关对象生成 QuerySet



我有一个复杂的数据模型,涉及两个相关的模型,如下所示:

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 类型,不适合我的口味。

相关内容

  • 没有找到相关文章

最新更新