【问题标题】:counting distinct values within a distinct value search on another field within same jango model在同一 jango 模型中的另一个字段上搜索不同值中的不同值
【发布时间】:2020-12-22 00:12:40
【问题描述】:

我正在尝试从我的 django 模型表中提取一些分析。到目前为止,我可以计算一个字段的总值和一个字段的不同值。我也知道如何创建显示不同字段中字段总值的列表。现在我想计算一个字段出现在一个不同字段的已经 distinct 值列表中的 distinct 实例。这是我正在使用的表格:

| uid   |  cid   |
|-------|--------|
| a     | apple  |
| a     | apple  |
| a     | grape  |
| b     | apple  |
| b     | grape  |
| c     | apple  |
| c     | pear   |
| c     | pear   |
| c     | pear   |

所以我试图提供的结果是:

cid: apple (distinct uid count: 3),
cid: grape (distinct uid count: 2),
cid: pear (distinct uid count: 1)

还有:

cid apple's distinct uid's: a, b, c
cid grape's distinct uid's: a, b
cid pear's distinct uid's: c

到目前为止,我已经能够像这样获得不同的计数和列表:

dist_uid_list = Fruit.objects.filter(client=user).values('uid').distinct()
output >>> {'uid': 'a', 'uid': 'b', 'uid': 'c'}

还有这个:

dist_uid_count = Fruit.objects.filter(client=user).values('uid').distinct().count()
output >>> {3}

还有更复杂的:

total_actions_per_cid = Fruit.objects\
            .filter(client=user)\
            .values('cid').distinct()\
            .annotate(num_actions=Count('action_name'))\
            .order_by('cid')
output >>> {'cid': 'apple', 'num_actions': '4'}{'cid': 'grape', 'num_actions': '2'}{'cid': 'pear', 'num_actions': '3'}

所以问题来了:我怎样才能进入并获取每个不同的“cid”并计算每个中存在多少不同的“uid”?

这里是所有可能有助于查看的 django 文件:

models.py

class Fruit(models.Model):
    uid = models.CharField(max_length=50, blank=True)
    cid = models.CharField(max_length=50, blank=True)
    record_date = models.DateTimeField(auto_now_add=True)
    client = models.CharField(max_length=50, blank=True)
    action_name = models.CharField(max_length=50, blank=True)

views.py

class DashboardListView(LoginRequiredMixin, ListView):
    model = Fruit
    template_name = 'blog/dashboard.html'
    context_object_name = 'fruit'
    ordering = ['-record_date']
    
    def get_context_data(self, **kwargs):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        context = super().get_context_data(**kwargs)
        dist_uid_list = Fruit.objects.filter(client=user).values('uid').distinct()
        dist_uid_count = Fruit.objects.filter(client=user).values('uid').distinct().count()
        total_actions_per_cid = Fruit.objects\
            .filter(client=user)\
            .values('cid').distinct()\
            .annotate(num_actions=Count('action_name'))\
            .order_by('cid')
        context['dist_uid_list'] = dist_uid_list
        context['dist_uid_count'] = dist_uid_count
        context['total_actions_per_cid'] = total_actions_per_cid

html 输出

{% for user in dist_uid_list %}
    {{ user.uid }}
{% endfor %}

    {{ dist_uid_count }}

{% for action in total_actions_per_cid %}
    {{ num_actions }}
{% endfor %}

我认为需要某种形式的 forloop 操作和视图中涉及的多个 def 才能使其工作。我只是不知道该怎么做。

【问题讨论】:

    标签: python django analytics dashboard


    【解决方案1】:

    Count 聚合有一个不同的参数,可能会有所帮助:

    >>> q = Book.objects.annotate(Count('authors', distinct=True), Count('store', distinct=True))
    

    https://docs.djangoproject.com/en/3.1/topics/db/aggregation/#combining-multiple-aggregations

    因此您的查询将如下所示:

    # I removed the distinct after .values, as the values works
    # like a GROUP BY, thus you will get already unique 'cid's
    total_actions_per_cid = Fruit.objects\
                .filter(client=user)\
                .values('cid') \
                .annotate(num_uids=Count('uid', distinct=True))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多