首页 > 解决方案 > 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的正确对象,我需要将其保留在结果中。Ax

剩下要做的就是转换查询集,使其返回相应的B对象(对象一对一A)并x重新附加注释。

如何?

标签: djangodjango-models

解决方案


真他妈复杂...

这似乎是这样做的:

# 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 类型不符合我的口味。)


推荐阅读