Django - 我如何根据这种关系获得这个对象计数
Django - How can i get this objects count based on this relationship
我有两个模型,它们是 Influencer
和 InfluencerList
。我的模型关系是:
User
和InfluencerList
是多对一的关系(一个用户可以有多个列表)
Influencer
和InfluencerList
是多对多关系(一个网红可以在多个列表中或者一个列表可以包含多个网红)
我想显示登录用户,每个列表的名称和数量(其中有多少影响者)
我设法列出了用户自己的列表,但我不知道如何获取该列表的计数。我想应该通过查找(关联)table.
来完成
这是我的model.py:
class Influencer(models.Model):
# fields are not included for clarity
def __str__(self):
return self.url
class InfluencerList(models.Model):
name = models.CharField('Name:', max_length=20, blank=False)
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')
influencers = models.ManyToManyField('Influencer', related_name='lists')
def __str__(self):
return self.name
# some method like getCount() would be nice here
view.py:
class InfluencerListView(LoginRequiredMixin, ListView):
model = Influencer
context_object_name = 'Influencers'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
logged_in_user = self.request.user
context['InfluencerLists'] = logged_in_user.lists.all();
return context
我也不确定是否必须将 count 之类的字段添加到我的 InfluencerList 模型中。如果有人能解释我为什么或为什么不这样做,那就太好了。谢谢你的帮助。
logged_in_user.lists.values(
'name',
).annotate(
influencers_count=Count('influencers'),
)
它应该 return 一个字典列表:
[{'name': 'InfluenceList1', 'influencers_count': 10}, {'name': 'InfluenceList2', 'influencers_count': 20}]
您的特定模型结构和关系可能是一个用户可以拥有多个影响者列表。
因为我不确定你想用 objects count
实现什么,我将只向你展示哪些方法能够访问所有计数器......根据你的示例代码:
from django.db.models import Count
class InfluencerListView(LoginRequiredMixin, ListView):
model = Influencer
context_object_name = 'influencers' # recommended lowercase variables
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
logged_in_user = self.request.user
first_list = logged_in_user.lists.first()
first_list_influencers_count = first_list.influencers.count()
influencers_list = Influencer.objects.filter(lists__owner=logged_in_user)
influencers_count = Influencer.objects.filter(lists__owner=logged_in_user).count()
influencers_nested = logged_in_user.lists.values('name').annotate(influencers_count=Count('influencers'))
extra_context = {
'influencer_lists': logged_in_user.lists.all(),
'influencer_lists_counter': logged_in_user.lists.count(),
'first_list': first_list,
'first_list_influencers_count': first_list_influencers_count,
'influencers_list': all_influencers_list,
'influencers_count': all_influencers_count,
'influencers_nested': influencers_nested
}
context.update(extra_context)
return context
注意:如果你只需要 Counter/quantity
最好使用 .count()
如果你还需要 list
那么你可以轻松获得 .all() | .filter()
并获得来自 len(queryset_list)
(.py 文件)或 {% queryset_list| length %}
(html 模板文件)的计数器。
我有两个模型,它们是 Influencer
和 InfluencerList
。我的模型关系是:
User
和InfluencerList
是多对一的关系(一个用户可以有多个列表)
Influencer
和InfluencerList
是多对多关系(一个网红可以在多个列表中或者一个列表可以包含多个网红)
我想显示登录用户,每个列表的名称和数量(其中有多少影响者) 我设法列出了用户自己的列表,但我不知道如何获取该列表的计数。我想应该通过查找(关联)table.
来完成这是我的model.py:
class Influencer(models.Model):
# fields are not included for clarity
def __str__(self):
return self.url
class InfluencerList(models.Model):
name = models.CharField('Name:', max_length=20, blank=False)
owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')
influencers = models.ManyToManyField('Influencer', related_name='lists')
def __str__(self):
return self.name
# some method like getCount() would be nice here
view.py:
class InfluencerListView(LoginRequiredMixin, ListView):
model = Influencer
context_object_name = 'Influencers'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
logged_in_user = self.request.user
context['InfluencerLists'] = logged_in_user.lists.all();
return context
我也不确定是否必须将 count 之类的字段添加到我的 InfluencerList 模型中。如果有人能解释我为什么或为什么不这样做,那就太好了。谢谢你的帮助。
logged_in_user.lists.values(
'name',
).annotate(
influencers_count=Count('influencers'),
)
它应该 return 一个字典列表:
[{'name': 'InfluenceList1', 'influencers_count': 10}, {'name': 'InfluenceList2', 'influencers_count': 20}]
您的特定模型结构和关系可能是一个用户可以拥有多个影响者列表。
因为我不确定你想用 objects count
实现什么,我将只向你展示哪些方法能够访问所有计数器......根据你的示例代码:
from django.db.models import Count
class InfluencerListView(LoginRequiredMixin, ListView):
model = Influencer
context_object_name = 'influencers' # recommended lowercase variables
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
logged_in_user = self.request.user
first_list = logged_in_user.lists.first()
first_list_influencers_count = first_list.influencers.count()
influencers_list = Influencer.objects.filter(lists__owner=logged_in_user)
influencers_count = Influencer.objects.filter(lists__owner=logged_in_user).count()
influencers_nested = logged_in_user.lists.values('name').annotate(influencers_count=Count('influencers'))
extra_context = {
'influencer_lists': logged_in_user.lists.all(),
'influencer_lists_counter': logged_in_user.lists.count(),
'first_list': first_list,
'first_list_influencers_count': first_list_influencers_count,
'influencers_list': all_influencers_list,
'influencers_count': all_influencers_count,
'influencers_nested': influencers_nested
}
context.update(extra_context)
return context
注意:如果你只需要 Counter/quantity
最好使用 .count()
如果你还需要 list
那么你可以轻松获得 .all() | .filter()
并获得来自 len(queryset_list)
(.py 文件)或 {% queryset_list| length %}
(html 模板文件)的计数器。