2016-09-13 4 views
0

Итак, я хочу получить последний результат для списка значений из базы данных.Django: Как получить последнее значение от db

Пример:

Task 
col1 col2 
1 1 
2 12 
3 32 
4 1 
5 24 
1 25 
2 62 
3 7 
2 81 
1 9  -> last occurence for '1' in 'col1' 
4 10  -> last occurence for '4' in 'col1' 
3 121 
5 12  -> last occurence for '5' in 'col1' 

Там в список «г», и я хочу написать запрос таким образом, что я получаю последние результаты из таблицы «Task» такой, что г существует в col1. Предполагая, 'Z' является:

z = [1, 4, 5] 

Я хочу, чтобы конечный результат как:

col1 col2 
1 9 
4 10 
5 12 

Есть 2 решения, которые я придумал. Solution1 выглядит следующим образом:

all_results = Task.objects.filter(col1__in=z) 
results = dict() 
for result in results: 
    results[result.col1] = result 

Solution2 выглядит следующим образом:

results = dict() 
for x in z: 
    results[x] = Task.objects.filter(col1=x).reverse()[0] 

Но мне интересно, если есть способ совместить оба решения вместе, так что я только сделать один запрос к базе данных и получить результаты для каждого отдельного «col1». Причина: Моя база данных очень большая, и в настоящее время я реализовал Solution2, который делает весь процесс очень медленным. Решение1 невозможно, так как есть несколько записей, а словарь «результатов» будет очень большим, и, следовательно, это займет много времени.

+0

Кажется, вас беспокоит скорость и пространство выполнения. Я думаю, что это может быть одним из способов: если вы знаете частоту обновления таблицы «Задача», затем извлекаете последние строки «n» (вместо фильтрации в «z») и выполняете операцию поиска по этим строкам, если они в 'z'. Если он сможет найти все элементы в 'z', тогда вам будет хорошо идти. Если он не смог найти, вы можете увеличить 'n' до' n'' и получить другие строки 'n''. Это сэкономит вам пространство и время. Но улов здесь - это появление элементов в 'z', часто встречающихся достаточно. – stuartnox

+0

@stuartnox размер стола в тысячах, если не миллионы. Кроме того, таблица обновляется довольно часто, поэтому значение, которое нужно присвоить «n», будет большим обсуждением. Кроме того, в приведенном выше примере z также может хранить такие значения, как [6, 7], и вы можете видеть, что оба [6, 7] не существуют в таблице. Поэтому я буду продолжать обновлять «n», пока не дойду до конца. –

+0

Если у вас нет другого ключа для упорядочения столбцов (например, обновленного в), я не верю, что порядок таблицы гарантирован. http://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record – Alexander

ответ

0

Вы можете получить этот результат из QuerySet. Ваш запрос ORM будет:

Task.objects.filter(col1__in=z).values('col1').annotate(latest_record=Max('col2')) 
# where z = [1, 4, 5] 
+0

. Результаты не зависят от значения 'col2'. Я отредактировал свой вопрос, надеюсь, что это поможет. и спасибо за ваш ответ. Я попытаюсь подражать и увижу, смогу ли я придумать окончательный намеченный ответ. –

Смежные вопросы