Django 获取嵌套相关对象的计数

Django get count of nested related object

我正在使用 Django 2.2

我有三个模型

class LeadList(SafeDeleteModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=128, verbose_name='Lead List Name')

    def entries_count(self):
        return LeadListEntry.objects.filter(
            dynamic_url_object__lead_list=self
        ).count()
class DynamicUrlObject(SafeDeleteModel):
    lead_list = models.ForeignKey(
        LeadList,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        default=None,
        related_name='dynamic_url_object'
    )
class LeadListEntry(models.Model):
    dynamic_url_object = models.ForeignKey(
        'otherapp.DynamicUrlObject',
        on_delete=models.CASCADE,
        related_name='lead_list_entry'
    )
    data = models.TextField(help_text='Lead List entry data. (JSON data)', blank=False)

LeadListDynamicUrlObject 中有引用。 LeadList 可以链接到多个 DynamicUrlObject 个实例。

LeadListEntry 链接到 DynamicUrlObject 以记录每个 DynamicUrlObject 个实例的数据。

我想获得特定 LeadListcount LeadListEntry

为此,我在 LeadList 模型中有一个模型方法来 return LeadListEntry 条目的计数。

但是在获取 LeadList 的列表时,它会产生 N+1 问题,其中为每个 lead_list 对象调用 entries_count依次在 LeadListEntry 上运行查询以获取计数。

我试过在

这样的视图中使用prefetch_related
def get_queryset(self):
    return self.serializer_class.Meta.model.objects.filter(
        user=self.request.user
    ).prefetch_related(
        'dynamic_url_object__lead_list_entry'
    )

但是没有任何好处。

如何让每个 lead_list 对象的 count 没有 运行 进入 N+1 问题?

你可以做到

ll = LeadList.objects.first()  # some lead list object

le_count = LeadListEntry.objects.filter(dynamic_url_object__lead_list=ll).count()

编辑

您可以像这样使用注释。

from django.db.models import Count


ll = LeadList.objects.annotate(le_count=Count('dynamicurlobject__leadlistentry'))

ll 查询集中的每个对象都有一个属性 le_count,其中包含该特定对象的潜在客户列表条目总数。