Django ORM我如何获得平均价值

时间:2016-02-26 12:47:04

标签: sql django django-orm

models.py

class Testimonials(models.Model):
    RATING = (
            (1,'Очень плохо'),
            (2,'Плохо'),
            (3,'Средне'),
            (4,'Хорошо'),
            (5,'Очень хорошо'),
        )
    EXP = (
            (1, 'Не указан'),
            (2, 'Один день'),
            (3, 'Одна неделя'),
            (4, 'Один месяц'),
            (5, 'Более года'),
        )
    user = models.OneToOneField(User)
    publish = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    testimonial = models.TextField(max_length=1000, null=True, blank=True)
    rating_sup = models.IntegerField(choices=RATING, max_length=1, null=True, blank=True)
    rating_stability = models.IntegerField(choices=RATING, max_length=1, null=True, blank=True)
    rating_trust = models.IntegerField(choices=RATING, max_length=1, null=True, blank=True)
    experience = models.IntegerField(choices=EXP, max_length=1, default=1, blank=True)
    affiliate = models.ForeignKey(Affiliate, null=True, blank=True)
    offer = models.ForeignKey(Offer, null=True, blank=True)

我的查询集是:

Affiliate.objects.get(pk=2).testimonials_set.all().aggregate(Avg('rating_trust'), Avg('rating_sup'), Avg('rating_stability'))

结果:

{'rating_stability__avg': 3.0, 'rating_trust__avg': None, 'rating_sup__avg': 4.0}

我如何得到平均值,3个值((3 + 4)/2=3.5)

2 个答案:

答案 0 :(得分:2)

您必须尝试使用​​F()函数。我认为这可以解决你的问题

https://docs.djangoproject.com/en/1.7/ref/models/queries/#f-expressions

Affiliate.objects.get(pk=2).testimonials_set.all().aggregate(Avg(F('rating_stability') + F('rating_sup')))

答案 1 :(得分:1)

您可以为要汇总的模型字段添加default=0值:

rating_sup = models.IntegerField(choices=RATING, max_length=1, blank=True, default=0)
rating_stability = models.IntegerField(choices=RATING, max_length=1, blank=True, default=0)
rating_trust = models.IntegerField(choices=RATING, max_length=1, blank=True, default=0)

然后您可以使用Avg

聚合所有线索字段
Affiliate.testimonials_set.all().aggregate(avr=Avg(F('rating_trust') + F('rating_sup') + F('rating_stability'))).order_by('avr')