我正在尝试最可能预测的数据点类别。因为代码是最好的解释:
模型:
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作为数据库后端。
答案 0 :(得分:0)
聚合:
from django.db.models import Max
values = DataPoint.objects.annotate(max_result=Max('predresult__value'))
现在values
中的每个元素都有max_result
属性,其中包含最大相关结果。