gpt4 book ai didi

python - 使用 django 计数或 values_list 计数器,哪个更好?

转载 作者:行者123 更新时间:2023-11-28 18:48:33 28 4
gpt4 key购买 nike

我写了一个导出数据的 View ,我的模型是这样的:

class Event(models.Model):
KIND_CHOICES = (('doing', 'doing'),
('done', 'done'),
('cancel', 'cancel'))
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey('auth.User')
kind = models.CharField(max_length=20, choices=KIND_CHOICES)

事件是三种中的一种,每个用户每个月可能有3~10个事件,我先查询这个月的事件:

events_this_month = Event.objects.filter(created_at__year=2013,
created_at__month=5)

然后找到所有用户:

users = User.objects.all()

我这样导出数据:

for user in users:
# 1000 users with 5 events each
user_events = events_this_month.filter(created_by=user)
doing_count = user_events.filter(kind='doing').count()
done_count = user_events.filter(kind='done').count()
cancel_count = user.events.filter(kind='cancel').count()

append_to_csv([user.username, doing_count, done_count, cancel_count])

然后我尝试使用 collections.Counter,我认为这会减少 SQL 次数(实际上它从 3000+ 减少到 1200):

for user in users:
user_events = events_this_month.filter(created_by=user)
counter = Counter(user_events.values_list('kind', flat=True))
doing_count = counter['doing']
done_count = counter['done']
cancel_count = counter['cancel']

...

哪种方式更好

哪里有更惯用的方法来更有效统计这样的数据?

最佳答案

这没有经过测试,但想法是按 user 分组,然后按 kind 分组:

from django.db.models import Count

events_this_month = Event.objects.values('created_by', 'kind') \
.filter(created_at__year=2013, created_at__month=5) \
.annotate(cc=Count('kind'))

让我知道这是否有效,因为我还没有测试过。

关于python - 使用 django 计数或 values_list 计数器,哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498834/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com