首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一jango模型中的另一个字段中计算不同值内的不同值

在同一jango模型中的另一个字段中计算不同值内的不同值
EN

Stack Overflow用户
提问于 2020-09-02 19:04:50
回答 1查看 26关注 0票数 0

我试图从我的django模型表中提取一些分析。到目前为止,我可以计算字段的总价值和字段的不同值。我还知道如何创建列表,显示不同字段中字段的总价值。现在,我想计算不同的实例--一个字段出现在一个不同字段的不同值列表中。这是我正在工作的桌子:

代码语言:javascript
复制
| uid   |  cid   |
|-------|--------|
| a     | apple  |
| a     | apple  |
| a     | grape  |
| b     | apple  |
| b     | grape  |
| c     | apple  |
| c     | pear   |
| c     | pear   |
| c     | pear   |

所以我想提供的结果是:

代码语言:javascript
复制
cid: apple (distinct uid count: 3),
cid: grape (distinct uid count: 2),
cid: pear (distinct uid count: 1)

还包括:

代码语言:javascript
复制
cid apple's distinct uid's: a, b, c
cid grape's distinct uid's: a, b
cid pear's distinct uid's: c

到目前为止,我已经得到了如下明确的计数和列表:

代码语言:javascript
复制
dist_uid_list = Fruit.objects.filter(client=user).values('uid').distinct()
output >>> {'uid': 'a', 'uid': 'b', 'uid': 'c'}

这是:

代码语言:javascript
复制
dist_uid_count = Fruit.objects.filter(client=user).values('uid').distinct().count()
output >>> {3}

更复杂的是:

代码语言:javascript
复制
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'}

,所以这里有一个问题:我怎么才能进去,把每个不同的‘in’都取出来,然后计算出每个‘uid’存在多少个?

以下是所有可能有助于查看的django文件:

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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输出

代码语言:javascript
复制
{% for user in dist_uid_list %}
    {{ user.uid }}
{% endfor %}

    {{ dist_uid_count }}

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

我假设需要在视图中包含一些for循环操作和多个防御措施,才能使这一工作正常进行。我只是不知道该怎么做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 19:20:44

计数聚合有一个不同的参数,可能有助于:

代码语言:javascript
复制
>>> 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

因此,您的查询将类似于:

代码语言:javascript
复制
# 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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63712069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档