Django Queryset根据另一个字段的排序创建.values()

时间:2011-06-03 18:33:06

标签: django django-queryset django-aggregation

我正在尝试最可能预测的数据点类别。因为代码是最好的解释:

模型:

class DataPoint(models.Model):
    #... unimportant fields

class PredResult(models.Model):
    likelihood = models.FloatField()
    value = models.IntegerField()
    data_point = models.ForeignKey(DataPoint)

对于每个DataPoint对象,我试图找到具有最高可能性的PredResult的value。目前我正在使用for循环:

data_points = DataPoints.objects.select_related('predresult')
for dp in data_points:
    if dp.predresult_set.all().exists():
        val = dp.predresult_set.order_by('-likelihood')[0].value
        #do other stuff here with val and dp

我想在best_value查询集中添加DataPoint字段。目前每个DataPoint有~5个PredResult对象和~20,000个DataPoints(尽管这可能会迅速膨胀)。但是,这个for循环在视图中完成的时间太长。

有人可以建议一种方法来解决这个问题吗? Django ORM技巧,extra()上的Queryset方法。或者您认为我应该在post-save对象上使用PredResult方法并直接更新DataPoint对象上的字段?

如果需要,我使用MySQL作为数据库后端。

1 个答案:

答案 0 :(得分:0)

聚合:

from django.db.models import Max
values = DataPoint.objects.annotate(max_result=Max('predresult__value'))

现在values中的每个元素都有max_result属性,其中包含最大相关结果。