Python 列表视图 - 按相同的用户和日期获取和分组表的数据

拉多万·桑塔

你好。我正在开发网络应用程序,我正在尝试编写一个列表视图,用于从数据库中获取数据以创建一个用于统计的表。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章