Django:通过相关表中的AVG()字段进行排序查询

时间:2018-01-23 09:03:30

标签: python django

我有两个型号

class Item(VoteModel, models.Model):
    **some_fields**

class ItemRating(models.Model):
    score = models.IntegerField(default=0)
    item_id = models.ForeignKey(Item)

我想通过ItemRating的Averadge评分订购商品查询

在SQL中,它会像这样

SELECT it.*, AVG(ir.score) as rating FROM Item it, ItemRating ir WHERE it.id = ir.item_id ORDER BY rating;

如何在django中做到这一点?谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个并检查它是否符合您的要求:

from django.db.models import Avg
frst = Item.objects.value_list('id', flat=True)  
scnd = ItemRating.objects.filter(
      item_id__in=frst).annotate(rating=Avg('score')).order_by('rating').values_list('rating', flat=True)

答案 1 :(得分:0)

原来这很简单。

您可以使用相关表格中的字段注释模型的查询,并使用它进行订购或执行其他操作。

我的问题代码:

item = Item.objects.all()               
itemsrc = item.annotate(rating=Avg('itemrating__score')).order_by('rating')

查看文档以获取更多详细信息 https://docs.djangoproject.com/en/2.0/topics/db/aggregation/#joins-and-aggregates