python - 使用值聚合 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'
)
我的代码现在看起来很乱,我仍然收到上述错误。我是否以正确的方式进行这种聚合?如果是这样,我应该如何修复错误?如果不是,有什么更好的方法来完成这个动态变化列表聚合?
提前致谢。
解决方案
推荐阅读
- gitlab - 如何拥有另一个“实例”阶段?
- python - 如何在 Flask 中正确设置我的应用程序路由?
- selenium-chromedriver - Locust/Selenium - 在无头模式下运行,用户登录后执行停止
- javascript - 通过使用 async/await 模拟 .reduce() 来循环异步调用
- flutter - 在颤动运行期间我总是遇到同样的错误
- salesforce - 活动工作流程
- git - 有没有办法标记 git 提交以防止推送(即使跨合并/樱桃挑选)?
- c# - 在存储库中使用 ThenInclude() 方法
- discord.py - 每次有人使用命令时如何在数字上加 + 1
- python - 如何从python中没有空格的字符串中提取数据