Django Queryset создает .values ​​() на основе сортировки другого поля - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь определить наиболее вероятную категорию для точки данных.Поскольку код является лучшим объяснением:

модели:

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

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

Для каждого объекта DataPoint я пытаюсь найти value для PredResult с наибольшей вероятностью.В настоящее время я использую цикл 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.В настоящее время существует около 5 объектов PredResult на DataPoint и ~ 20 000 точек данных (хотя это может быстро увеличиваться).Однако этот цикл for занимает слишком много времени для завершения в представлении.

Может кто-нибудь предложить способ справиться с этим?Либо трюк с Django ORM, метод extra() на Queryset.Или вы думаете, что мне следует использовать метод post-save для объекта PredResult и обновить поле непосредственно для объекта DataPoint?

Если это необходимо, я использую MySQL в качестве бэкенда базы данных.1021 *

1 Ответ

0 голосов
/ 03 июня 2011

Aggregation:

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

Теперь каждый элемент в values имеет атрибут max_result, содержащий максимальный связанный результат.

...