在同一 jango 模型中的另一个字段上计算不同值搜索中的不同值
counting distinct values within a distinct value search on another field within same jango model
我正在尝试从我的 Django 模型中提取一些分析 table。到目前为止,我可以计算一个字段的总值和一个字段的不同值。我也知道如何创建显示不同字段中字段总值的列表。现在我想计算一个字段出现在已经 distinct 不同字段的值列表中的 distinct 实例。这是我正在使用的 table:
| 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 操作和多个 defs 才能使这项工作正常进行。我只是不太明白我应该怎么做。
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))
我正在尝试从我的 Django 模型中提取一些分析 table。到目前为止,我可以计算一个字段的总值和一个字段的不同值。我也知道如何创建显示不同字段中字段总值的列表。现在我想计算一个字段出现在已经 distinct 不同字段的值列表中的 distinct 实例。这是我正在使用的 table:
| 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 操作和多个 defs 才能使这项工作正常进行。我只是不太明白我应该怎么做。
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))