Django ORM получает максимальное значение поля и соответствующие значения других столбцов - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть DataFrame:

`exp_no`   'time'   'price'

  1       0:00:00     20.0
  1       7 days      45.0
  1       15 days     100.0
  2       0:00:00     20.0
  2       7 days      45.0
  2       15 days     100.0

Соответствующая модель Django:

class StData(models.Model):
      exp_no = models.ForeignKey(StIndex, on_delete=models.CASCADE)
      time = models.DateTimeField()
      price = models.DecimalField(max_digits=10, decimal_places=2)   

Я хочу создать таблицу меньшего размера, которая будет иметь exp_no, max_timeи соответствующую цену, такую ​​что:

 `exp_no`   'time'   'price'

  1       15 days     100.0
  2       15 days     100.0

В пандах я бы сделал df.groupby('exp_no')['time', 'price'].max().reset_index(), чтобы получить желаемую таблицу.

В аннотации Django ORM, чтобы получитьтот же результат (или Queryset), если я делаю:

qs.values('exp_no').annotate(max_time=Max('time')).order_by()

, он дает мне exp_no и время, но я также хочу получить соответствующую цену.Я просмотрел этот ответ в SO: Django orm получить последнюю версию для каждой группы

Но не уверен, как я получу цену.Использование Django 2.0 с sqlite3.

Я ценю любую помощь.

1 Ответ

0 голосов
/ 27 сентября 2018

Ваш вопрос сводится к получению объекта StData (или значений) для записи с наибольшим столбцом time.Таким образом, нам не нужен агрегат, но мы получаем наименьшую или наибольшую строку по столбцу time.

Получение объекта StData с максимальным значением time

. Вы можетепросто получите строку last() при заказе на 'time', например:

stdata_max_time = qs<b>.order_by('time').last()</b>  # will return a StData

или, альтернативно:

stdata_max_time = qs<b>.order_by('-time').first()</b>  # will return a StData

В случае, если time НЕДЕЙСТВИТЕЛЕН (не здесь),вы можете убедиться, что вы не получите строку с NULL, указав, что при заказе они должны быть размещены как первый / последний элементы соответственно:

from django.db.models import F

# two alternatives
stdata_max_time = qs.order_by(<b>F('time', nulls_first=True)</b>).last()
stdata_max_time = qs.order_by(<b>F('-time', nulls_last=True)</b>).first()

Таким образом, это объект StData, и выТаким образом, можно получить всю необходимую информацию из этого объекта.Поскольку это StData объект, он также будет вести себя так (поэтому дополнительные свойства, методы и т. Д., Которые вы определили, также будут работать).

Получение значений с максимальным значением time

Это полностью аналогично, за исключением того, что мы добавили в запрос .values(..):

stdata_max_time = qs.order_by('time')<b>.values('exp_no', 'time', 'price')</b>.last()

Но если нет действительно веских причин, я лично предпочел бы получить StDataобъект, поскольку это означает « батареи включены » (вы получаете всю логику, которую вы написали в классе StData для этого объекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...