Вы не можете сделать это с помощью запроса;это просто слишком много логики для SQL.Однако, основываясь на том факте, что ключи словаря уникальны, вы можете получить то, что хотите, с небольшой изобретательностью.
Сначала получите набор запросов, упорядоченный по дате по возрастанию .Это может показаться нелогичным, потому что вам нужна последняя дата, но это будет иметь смысл на следующих шагах:
qs = SomeModel.objects.order_by('date')
Далее, мы будем использовать это в понимании списка для создания (key, value)
кортежей(в Python 3+ вы действительно можете понимать словарь, но поскольку не многие из тех, кого я знаю, используют Python 3+, я подробно описываю это так):
qs_list = [(item.last_name, item) for item in qs]
Наконец, мы конвертируем этосписок кортежей в словаре:
items = dict(qs_list)
Теперь у вас будет словарь, в котором каждый ключ last_name уникален.Так как ключи словаря должны быть уникальными, последним значением каждой дублируемой фамилии было то, которое фактически сделало его. Поскольку список был упорядочен по возрастанию даты, последнее значение было «последним».
Вы можетепреобразовать этот словарь обратно в прямой список или просто перебрать его как есть.Единственная загвоздка в том, что вы больше не имеете дело с QuerySet, поэтому вы не можете выполнять какие-либо дополнительные фильтры и т. Д. Просто помните об этом и выполняйте эти шаги в последнюю очередь после того, как вы полностью построите свой запрос.1018 * И, конечно, вы можете сделать это как один вкладыш, если вы так склонны:
items = dict([(item.last_name, item) for item in SomeModel.objects.order_by('date')])