【问题标题】:Django ORM How I can get average valueDjango ORM我如何获得平均值
【发布时间】:2016-06-09 16:37:41
【问题描述】:

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)

【问题讨论】:

  • 你的意思是,如何计算?
  • 不,我需要获取 3 个不同列的平均值,然后按该值排序
  • 如果没有应该被忽略

标签: sql django django-orm


【解决方案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 聚合所有 thre 字段

Affiliate.testimonials_set.all().aggregate(avr=Avg(F('rating_trust') + F('rating_sup') + F('rating_stability'))).order_by('avr')

【讨论】:

  • 它给了我 TypeError: __init__() 正好需要 2 个参数(给定 4 个)
  • 我认为设置 default=0 不会阻止 F('...') 成为 None。是吗?
  • @AntoinePinsard 我认为应该是0:正如文档所说的An F() object represents the value of a model field...
  • 因此,如果数据库中的值为 NULL,则 F(...) 表达式应评估为 None。 (我认为)
【解决方案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')))

【讨论】:

  • 这里的问题是,如果 'rating_stability' 或 'rating_sup' 之一为 NULL,则总和将为 NULL,这将给出错误的结果。
猜你喜欢
  • 2012-03-18
  • 2022-08-14
  • 2012-11-27
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2012-06-30
  • 2021-05-30
相关资源
最近更新 更多