[英]Django use queryset method in annotation
我正在一个带有课程和部分模型的Django项目中。
我制作了一个自定义的聚合方法,即“ stats”(用于各部分),该方法输出值的字典。
我想按讲师对我的部分进行分组,并为每组注释各自的统计信息。
到目前为止,我已经尝试过:
我首先获得一门课程并将其存储为course
。
course.sections.values('instructor').annotate(section_count=Count('instructor'))
我想做类似的事情: course.sections.values('instructor').annotate(section_count=Count('instructor'), **stats)
,尽管显然不起作用
这是我的Section模型:
class Section(models.Model):
course = models.ForeignKey(Course, related_name='sections')
instructor = models.CharField()
average_GPA = models.DecimalField()
As = models.DecimalField()
Bs = models.DecimalField()
Cs = models.DecimalField()
Ds = models.DecimalField()
Fs = models.DecimalField()
withdrawals = models.PositiveIntegerField()
class_size = models.PositiveIntegerField()
objects = SectionQueryset.as_manager()
这是queryset代码:
class SectionQueryset(models.QuerySet):
def stats(self):
def safe_round(val):
return round(val, 2) if (type(val) is float) else val
data = self.aggregate(
GPA=Avg('average_GPA'),
A=Avg('As'), B=Avg('Bs'),
C=Avg('Cs'), D=Avg('Ds'), F=Avg('Fs'),
students=Sum('class_size'),
withdrawals=Sum('withdrawals'))
return {key: safe_round(value) for key, value in data.items()}
我在玩这些注释,意识到可以将它们存储为字典:
stats_dict = {'average_GPA': Avg('average_GPA'),
'As': Avg('As'), 'Bs': Avg('Bs'),
'Cs': Avg('Cs'), 'Ds': Avg('Ds'), 'Fs': Avg('Fs'),
'students': Sum('class_size'),
'withdrawals': Sum('withdrawals')}
那么我可以在Queryset部分的stats方法中使用**
: data = self.aggregate(**stats_dict)
。 这相当于我以前的工作,但是后来我意识到我可以做:
raw_stats = {'average_GPA': (Avg,'average_GPA'),
'As': (Avg,'As'), 'Bs': (Avg,'Bs'),
'Cs': (Avg,'Cs'), 'Ds': (Avg,'Ds'), 'Fs': (Avg,'Fs'),
'students': (Sum,'class_size'),
'withdrawals': (Sum,'withdrawals')}
和
stats_dict = {key: t[0](t[1]) for key, t in raw_stats.items()}
这允许我做:
to_annotate = {k: t[0]('sections__'+t[1]) for k, t in raw_stats.items()}
self.get_queryset().annotate(**to_annotate)
在我的CourseModelManager中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.