Django注释 - 以编程方式选择聚合器

时间:2011-11-26 04:35:21

标签: django

我希望能够以编程方式决定在django annotate函数中使用哪个聚合器。也就是说,给出如下声明......

partsPerMachine = Machine.objects.annotate(num_parts=Count('parts'))

...我希望能够在运行时确定要使用哪个聚合器。我可以对parts进行求和/计数/平均/等等,我不会提前知道哪一个。

我不太了解django的作者用来创建这种语法的python魔法。如果这只是命名参数的情况,我可以使用Python的**语法来传递参数字典。但这似乎是另一回事......

1 个答案:

答案 0 :(得分:4)

聚合器只是Python类。在运行时选择所需聚合器的一种简单方法是将它们放入字典中,然后按键选择所需的聚合器:

from django.db.models import Count, Sum, Avg

aggregators = {
    'count': Count,
    'sum': Sum,
    'avg': Avg
}

my_aggregator = aggregators[my_key]
partsPerMachine = Machine.objects.annotate(num_parts=my_aggregator('parts'))