Возвращает значение модели на основе максимального значения другого поля модели.

avatar
Sarandis
8 августа 2021 в 21:39
59
2
0

У меня есть модель в Django с двумя полями: имя и счетчик. Я создал файл представлений и хочу найти и напечатать имя с самым большим счетчиком. Код ниже находит и печатает самый большой метр, что хорошо, но не то, что я хочу. Я хочу напечатать имя, связанное с этим счетчиком. Есть идеи, как это сделать?

Мои просмотры:

 def details (request):
  top_meter = Energy_Consuption.objects.aggregate(Max('meter'))
  return render(request,'details.html', {'top_meter':top_meter})

(Представление связано с HTML-страницей.)

Моя модель:

class Energy_Consuption(models.Model):
  name=models.IntegerField()
  meter=models.IntegerField()
  class Meta:
    db_table:'Energy_Consuption'
Источник

Ответы (2)

avatar
Tadeo
9 августа 2021 в 05:48
0

Вы можете просто отсортировать QuerySet по meter и взять последний элемент. Кроме того, вы можете использовать getattr в случае, если QuerySet пуст.

biggest_item = EnergyConsumption.objects.latest('meter')
biggest_name = getattr(biggest_item, 'name', None)

Если ваше поле meter не уникально, вы можете указать дополнительные поля для метода latest для устранения неоднозначности:

biggest_item = EnergyConsumption.objects.latest('meter', 'id')
avatar
Brian Destura
8 августа 2021 в 23:38
0

Вы можете сделать что-то вроде этого:

Energy_Consuption.objects.filter(
    meter=Energy_Consuption.objects.aggregate(Max('meter'))['meter__max']
).values_list('name', flat=True)

Это вернет список имен объектов Energy_Consuption, которые соответствуют максимальному значению. Обратите внимание, что здесь вам нужен фильтр, потому что может быть более одного Energy_Consuption с максимальным значением.