繁体   English   中英

Django在注释中使用queryset方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM