Итак, я хочу получить последний результат для списка значений из базы данных.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 невозможно, так как есть несколько записей, а словарь «результатов» будет очень большим, и, следовательно, это займет много времени.
Кажется, вас беспокоит скорость и пространство выполнения. Я думаю, что это может быть одним из способов: если вы знаете частоту обновления таблицы «Задача», затем извлекаете последние строки «n» (вместо фильтрации в «z») и выполняете операцию поиска по этим строкам, если они в 'z'. Если он сможет найти все элементы в 'z', тогда вам будет хорошо идти. Если он не смог найти, вы можете увеличить 'n' до' n'' и получить другие строки 'n''. Это сэкономит вам пространство и время. Но улов здесь - это появление элементов в 'z', часто встречающихся достаточно. – stuartnox
@stuartnox размер стола в тысячах, если не миллионы. Кроме того, таблица обновляется довольно часто, поэтому значение, которое нужно присвоить «n», будет большим обсуждением. Кроме того, в приведенном выше примере z также может хранить такие значения, как [6, 7], и вы можете видеть, что оба [6, 7] не существуют в таблице. Поэтому я буду продолжать обновлять «n», пока не дойду до конца. –
Если у вас нет другого ключа для упорядочения столбцов (например, обновленного в), я не верю, что порядок таблицы гарантирован. http://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record – Alexander