Django - 我如何根据这种关系获得这个对象计数

Django - How can i get this objects count based on this relationship

我有两个模型,它们是 InfluencerInfluencerList。我的模型关系是:

UserInfluencerList是多对一的关系(一个用户可以有多个列表)

InfluencerInfluencerList是多对多关系(一个网红可以在多个列表中或者一个列表可以包含多个网红)

我想显示登录用户,每个列表的名称和数量(其中有多少影响者) 我设法列出了用户自己的列表,但我不知道如何获取该列表的计数。我想应该通过查找(关联)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 模板文件)的计数器。