首页 > 解决方案 > 使用值聚合 Django 中的更改列表行

问题描述

我正在尝试修改模型的更改列表,以便用户可以选择不同的过滤器,这些过滤器将汇总模型中的特定字段,按不同的时间范围(周、月、年)分组。我创建了一个SimpleListFilter正确执行聚合的自定义。问题是它使用values返回dict对象而不是我的模型的方法,导致各种错误。

我的模型:

class UsageReport(models.Model):
    install = models.ForeignKey(
        Installation,
        on_delete=models.CASCADE,
        help_text='The install this report is associated with'
    )
    date = models.DateField(
        null=False,
        blank=False,
        default=None,
        help_text='The day this report\'s data is compiled for'
    )
    players_count = models.PositiveIntegerField(
        null=False,
        blank=False,
        default=0,
        help_text='The number of new players created'
    )
    captures_count = models.PositiveIntegerField(
        null=False,
        blank=False,
        default=0,
        help_text='The number of new captures created'
    )
    created_at = models.DateTimeField(auto_now_add=True, null=True)

我的自定义列表过滤器:

class DateGroupFilter(SimpleListFilter):
    title = 'Group By'
    parameter_name = 'group_by_date'

    def lookups(self, request, model_admin):
        return (
            ('week', 'Week'),
            ('month', 'Month'),
            ('year', 'Year')
        )

    def queryset(self, request, queryset):
        if self.value() == 'week':
            return queryset.annotate(week=ExtractWeek('date')).values('install', 'week').annotate(
                sum_players=Sum('players_count')).annotate(sum_captures=Sum('captures_count'))
        if self.value() == 'month':
            return queryset.annotate(month=ExtractMonth('date')).values('install', 'month').annotate(
                sum_players=Sum('players_count')).annotate(sum_captures=Sum('captures_count'))
        if self.value() == 'year':
            return queryset.annotate(year=ExtractYear('date')).values('install', 'year').annotate(
                sum_players=Sum('players_count')).annotate(sum_captures=Sum('captures_count'))

由于每个过滤器选项返回略有不同的字段(周、月、年),我尝试编写一个解决get_list_display方法来覆盖我的ModelAdmin类中的方法,并为每个不同的字段名称添加一个方法(它只是从返回dict),但这仍然会引发错误,因为dict没有所需的_meta属性。

我的模型管理员:

@admin.register(UsageReport)
class AdminUsageReport(admin.ModelAdmin):
    search_fields = ('install__name', 'install__id', 'date')
    ordering = ['-install__name', '-date']
    list_display_links = None
    list_select_related = []
    list_filter = (
        DateGroupFilter,
    )

    def week(self, obj):
        return obj['week']

    def month(self, obj):
        return obj['month']

    def year(self, obj):
        return obj['year']

    def sum_players(self, obj):
        return obj['sum_players']

    def sum_captures(self, obj):
        return obj['sum_players']

    def get_list_display(self, request):
        if request.GET.get('group_by_date') == 'week':
            return (
                'install',
                'week',
                'sum_players',
                'sum_captures'
            )
        elif request.GET.get('group_by_date') == 'month':
            return (
                'install',
                'month',
                'sum_players',
                'sum_captures'
            )
        elif request.GET.get('group_by_date') == 'year':
            return (
                'install',
                'year',
                'sum_players',
                'sum_captures'
            )
        else:
            return (
                'install',
                'date',
                'players_count',
                'captures_count'
            )

这是我得到的当前错误: 当前错误信息

我的代码现在看起来很乱,我仍然收到上述错误。我是否以正确的方式进行这种聚合?如果是这样,我应该如何修复错误?如果不是,有什么更好的方法来完成这个动态变化列表聚合?

提前致谢。

标签: pythondjangodjango-modelsaggregate

解决方案


推荐阅读