如何从django中的一组对象中获得平均值? 我有一个简单的属性评级系统。您给它标记了5个(星星)。模型是这样定义的 DEF属性(型号) #在这里 DEF等级(型号。模型) 属性...

问题描述 投票:0回答:2
我想做的就是获取财产,找到所有评级对象,收集它们,然后从中获取普通的“星星”。

任何想法如何做到这一点?

    

您应该使用

凝集(doc)

python django django-models django-queryset average
2个回答
42
投票
from django.db.models import Avg p = Property.objects.get(...) stars_average = list(p.rating_set.aggregate(Avg('stars')).values())[0]

不确定我的例子。

您可以使用
Aggregate()

antotate()

0
投票
()

()平均通过属性中的模型和属性中的恒星,如下所示。 *我需要使用Ratingorder_by('pk')一起使用annotate(),否则值以降序打印:

from django.db.models import Avg

# Average the stars in "Rating" model
print(Rating.objects.aggregate(Avg('stars'))) 

print()

# Average the stars in "Rating" model property by property
for obj in Property.objects.all(): 
    print(
        Rating.objects.filter(property=obj)
                      .aggregate(Avg('stars'))
    )

print()

# Average the stars in "Rating" model property by property
for obj in Property.objects.all(): 
    print(obj.rating_set.aggregate(Avg('stars')))

print()

# Average the stars in "Rating" model property by property
qs = Property.objects.annotate(Avg('rating__stars')).order_by('pk')
for obj in qs:
    print(obj.rating__stars__avg)
然后,下面的这些输出在控制台上:
{'stars__avg': 3.7}

{'stars__avg': 3.2}
{'stars__avg': 3.6}
{'stars__avg': 4.0}

{'stars__avg': 3.2}
{'stars__avg': 3.6}
{'stars__avg': 4.0}

3.2
3.6
4.0

,您可以将默认键
stars__avg

stars
列更改为
starsAvg

列,如下所示:

from django.db.models import Avg

# Average the stars in "Rating" model
print(Rating.objects.aggregate(starsAvg=Avg('stars'))) 
                               # ↑ Here
print()

# Average the stars in "Rating" model property by property
for obj in Property.objects.all(): 
    print(
        Rating.objects.filter(property=obj)
                      .aggregate(starsAvg=Avg('stars'))
    )                            # ↑ Here

print()

# Average the stars in "Rating" model property by property
for obj in Property.objects.all(): 
    print(obj.rating_set.aggregate(starsAvg=Avg('stars')))
                                   # ↑ Here
print()

# Average the stars in "Rating" model property by property
qs = Property.objects.annotate(starsAvg=Avg('rating__stars')).order_by('pk')
for obj in qs:                 # ↑ Here
    print(obj.starsAvg)
              # ↑ Here

then,然后更改默认键,如下所示:
{'starsAvg': 3.7}

{'starsAvg': 3.2}
{'starsAvg': 3.6}
{'starsAvg': 4.0}

{'starsAvg': 3.2}
{'starsAvg': 3.6}
{'starsAvg': 4.0}

3.2
3.6
4.0


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.