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)
LeadList
在 DynamicUrlObject
中有引用。
LeadList
可以链接到多个 DynamicUrlObject
个实例。
LeadListEntry
链接到 DynamicUrlObject
以记录每个 DynamicUrlObject
个实例的数据。
我想获得特定 LeadList
的 count 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
,其中包含该特定对象的潜在客户列表条目总数。
我正在使用 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)
LeadList
在 DynamicUrlObject
中有引用。
LeadList
可以链接到多个 DynamicUrlObject
个实例。
LeadListEntry
链接到 DynamicUrlObject
以记录每个 DynamicUrlObject
个实例的数据。
我想获得特定 LeadList
的 count 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
,其中包含该特定对象的潜在客户列表条目总数。