你好。我正在开发网络应用程序,我正在尝试编写一个列表视图,用于从数据库中获取数据以创建一个用于统计的表。
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
created = models.DateTimeField(_('created'), auto_now_add=True, db_index=True)
我有一个名为Activity的对象,其中“用户”为ForeignKey,“创建”为DateTimeField。
在这里你可以看到我的列表视图代码:
class ActivityCountListView(LoginPermissionRequiredMixin, DisplayListViewMixin, SortingListViewMixin, ListView,):
model = Activity
permission_required = 'directory.list_activity'
displays = ['list', 'table']
paginate_values = [10, 50, 100]
paginate_by_display = {'table': paginate_values, 'list': paginate_values}
sorting_options = {'-created': _('Newest'), 'created': _('Oldest'), '-modified': _("Recently modified")}
def get_queryset(self):
queryset = self.filter.qs.select_related('user')
return self.sort_queryset(queryset)
def dispatch(self, request, *args, **kwargs):
self.filter = ActivityFilter(request.user, request.GET, queryset=self.get_whole_queryset())
return super(ActivityCountListView, self).dispatch(request, *args, **kwargs)
def get_whole_queryset(self):
return Activity.objects.restrict_user(self.request.user)
def get_context_data(self, **kwargs):
context_data = super(ActivityCountListView, self).get_context_data(**kwargs)
context_data['filter'] = self.filter
activities = Activity.objects \
.annotate(day=ExtractDay('created'), month=ExtractMonth('created'), year=ExtractYear('created'))\
.values('user', 'day', 'month', 'year') \
.order_by('user')\
data = self.get_data(activities)
context_data.update({
'data': data
})
return context_data
def get_data(self, activities):
data = {}
for activities_data in activities:
print(activities_data)
user = activities_data['user']
day = activities_data['day']
month = activities_data['month']
year = activities_data['year']
dt = datetime(year, month, day).date()
formatted_date = str(dt)
data.update({user: dict()})
data[user][formatted_date] = 1
print(data.keys())
print(data.values())
print(data)
return data
使用此代码我得到这样的打印响应:
打印打印(活动数据):
{'user': 549, 'day': 24, 'month': 7, 'year': 2018}
{'user': 350, 'day': 24, 'month': 7, 'year': 2018}
{'user': 746, 'day': 31, 'month': 7, 'year': 2018}
{'user': 1, 'day': 31, 'month': 7, 'year': 2018}
{'user': 1, 'day': 24, 'month': 7, 'year': 2018}
{'user': 1, 'day': 24, 'month': 7, 'year': 2018}
{'user': 526, 'day': 31, 'month': 7, 'year': 2018}
{'user': 526, 'day': 24, 'month': 7, 'year': 2018}
{'user': 109, 'day': 24, 'month': 7, 'year': 2018}
{'user': 419, 'day': 24, 'month': 7, 'year': 2018}
打印(数据键()):
dict_keys([549, 350, 746, 1, 526, 109, 419])
打印(数据。值()):
dict_values([{'2018-07-24': 1}, {'2018-07-24': 1}, {'2018-07-31': 1}, {'2018-07-24': 1}, {'2018-07-24': 1}, {'2018-07-24': 1}, {'2018-07-24': 1}])
打印(数据):
{549: {'2018-07-24': 1}, 350: {'2018-07-24': 1}, 746: {'2018-07-31': 1}, 1: {'2018-07-24': 1}, 526: {'2018-07-24': 1}, 109: {'2018-07-24': 1}, 419: {'2018-07-24': 1}}
……但这不是我想要的,因为对于同一用户,只有一个日期,而且活动不算数……我希望得到这样的回应:
{549: {'2018-07-24': 1}, 350: {'2018-07-24': 1}, 746: {'2018-07-31': 1}, 1: {'2018-07-24': 2, '2018-07-31': 1,}, 526: {'2018-07-24': 1, '2018-07-31: 1}, 109: {'2018-07-24': 1}, 419: {'2018-07-24': 1}}
为了更好地理解: 如果同一用户有多个活动(例如用户 ID 1):
{'user': 1, 'day': 31, 'month': 7, 'year': 2018}
{'user': 1, 'day': 24, 'month': 7, 'year': 2018}
{'user': 1, 'day': 24, 'month': 7, 'year': 2018}
我期望这样的数据响应:
1: {'2018-07-24': 2, '2018-07-31': 1,},
并且不只是喜欢这样的:
1: {'2018-07-24': 1},
我真的不知道该怎么做。如果你能帮助我并写下我要更改的内容和添加到代码中的内容,我会很高兴你......非常感谢
用 itertools.groupby
>>> activities_lst = [{'user': 549, 'day': 24, 'month': 7, 'year': 2018}, {'user': 350, 'day': 24, 'month': 7, 'year': 2018}, {'user': 746, 'day': 31, 'month': 7, 'year': 2018}, {'user': 1, 'day': 31, 'month': 7, 'year': 2018}, {'user': 1, 'day': 24, 'month': 7, 'year': 2018}, {'user': 1, 'day': 24, 'month': 7, 'year': 2018}, {'user': 526, 'day': 31, 'month': 7, 'year': 2018}, {'user': 526, 'day': 24, 'month': 7, 'year': 2018}, {'user': 109, 'day': 24, 'month': 7, 'year': 2018}, {'user': 419, 'day': 24, 'month': 7, 'year': 2018}]
>>>
>>> from itertools import groupby
>>> f = lambda x: x['user']
>>> res = {user:['{year}-{month:02}-{day}'.format(**date) for date in date_lst] for user,date_lst in groupby(sorted(activities_lst, key=f), f)}
>>> res = {user:{date:len(list(v)) for date,v in groupby(date_lst)} for user,date_lst in res.items()}
>>>
>>> from pprint import pprint
>>> pprint(res)
{1: {'2018-07-24': 2, '2018-07-31': 1},
109: {'2018-07-24': 1},
350: {'2018-07-24': 1},
419: {'2018-07-24': 1},
526: {'2018-07-24': 1, '2018-07-31': 1},
549: {'2018-07-24': 1},
746: {'2018-07-31': 1}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句