У меня есть следующий Django модель:Джанго: Получить список последних стоимостной группой
class Costs(models.Model):
"""Represents a cost for a vendor/locale combo."""
valid_from_date = models.DateField()
vendor_id = models.ForeignKey('Vendor')
locale_id = models.ForeignKey('Locale')
cost = models.FloatField()
В целях сохранения исторических данных, при изменении стоимости для поставщика/локал комбо, мы просто добавить новое запись в таблицу (вместо перезаписывания старой) с новым valid_from_date
.
Довольно легко получить все данные из таблицы с помощью Costs.objects.all()
. Также легко получить текущее значение отдельного поставщика/локали с Costs.objects.filter(vendor_id=1, locale_id=10).latest()
.
Что мне нужно получить, это все последние значения стоимости для каждого компилятора vendor/locale. Таким образом, по существу выполняется функция latest()
по каждой комбинации и в результате получается список/запрос.
Например, если следующий набор данных:
- Id: 100, Дата: 2017-1-1, Производитель: 1, Язык: 10, стоимость: $ 1
- Id: 200, Дата: 2017-2-1, Продавец: 1, Местность: 10, Стоимость: 2
- Id: 300, Дата: 2017-1-1, Продавец: 2, Местность: 10, Стоимость: $ 3
- Id: 400, Дата: 2017-2-1, Продавец: 2, Местность: 10, Стоимость: $ 4
- Id: 500, Дата: 2017-1-1, Продавец: 2, Местность: 20, Стоимость: $ 5
Я хотел бы следующие данные обратно:
- Id: 200, Дата: 2017-2-1, Производитель: 1, Locale: 10, стоимость: $ 2
- Id: 400, Дата : 2017-2-1, Производитель: 2, Язык: 10, стоимость: $ 4
- Id: 500, Дата: 2017-1-1, Производитель: 2, Язык: 20, стоимость: $ 5
Я читал через aggregation docs несколько раз, но не могу найти ничего, что соответствует в совершенстве.
Я использую Django 1.10 с бэкэнд MySQL.
Любые идеи? Спасибо.
Спасибо за ответ. Это похоже на правильное направление, но я не думаю, что это вполне справедливо. Значения id не гарантируются как увеличение даты (исторические данные были загружены). Поэтому просто потому, что A.date> B.date не означает A.id> B.id.Если мы комментируем с помощью 'Max ('date')' вместо 'id', мы не сможем использовать строку' Costs.objects.filter() '. Есть идеи? – Chad