필드의 최대 값을 제공하기 위해 쿼리를 실행하는 방법에 대한 개체 목록이 있습니다.
이 코드를 사용하고 있습니다.
def get_best_argument(self):
try:
arg = self.argument_set.order_by('-rating')[0].details
except IndexError:
return 'no posts'
return arg
등급은 정수입니다.
답변:
참조 이 . 코드는 다음과 같습니다.
from django.db.models import Max
# Generates a "SELECT MAX..." query
Argument.objects.aggregate(Max('rating')) # {'rating__max': 5}
기존 쿼리 세트에서도 사용할 수 있습니다.
from django.db.models import Max
args = Argument.objects.filter(name='foo') # or whatever arbitrary queryset
args.aggregate(Max('rating')) # {'rating__max': 5}
이 최대 값을 포함하는 모델 인스턴스가 필요한 경우 게시 한 코드가이를 수행하는 가장 좋은 방법 일 것입니다.
arg = args.order_by('-rating')[0]
쿼리 세트가 비어있는 경우, 즉 쿼리와 일치하는 인수가없는 경우 오류가 발생합니다 ( [0]
부분이를 발생 시키기 때문에 IndexError
). 그 행동을 피하고 대신 단순히 None
그 경우에 반환 하려면 .first()
다음을 사용하십시오 .
arg = args.order_by('-rating').first() # may return None
Django에는 또한 최신 (최대 값) 항목을 찾는 ' latest (field_name = None) '함수가 있습니다. 날짜 필드뿐만 아니라 문자열 및 정수에서도 작동합니다.
해당 함수를 호출 할 때 필드 이름을 제공 할 수 있습니다.
max_rated_entry = YourModel.objects.latest('rating')
return max_rated_entry.details
또는 모델 메타 데이터에서 해당 필드 이름을 이미 제공 할 수 있습니다.
from django.db import models
class YourModel(models.Model):
#your class definition
class Meta:
get_latest_by = 'rating'
이제 매개 변수없이 'latest ()'를 호출 할 수 있습니다.
max_rated_entry = YourModel.objects.latest()
return max_rated_entry.details
latest()
. 최소값을 가진 레코드가 필요한 경우 earliest()
.
latest()
그리고 earliest()
너무 비 날짜 필드와 함께 작동하지만, 구현의 부작용이다. 당신은 사용해야 <your-queryset>.order_by('<interested-field>').first()
이나 <your-queryset>.order_by('<interested-field>').last()
여전히 장고 개발자가 변경됩니다 작품 않더라도 코드 확인 latest()
및 earliest()
날짜 필드 만에 작업을 구현합니다.
내 프로젝트에 대해 이것을 테스트했으며 O (n) 시간에서 최대 / 최소를 찾습니다.
from django.db.models import Max
# Find the maximum value of the rating and then get the record with that rating.
# Notice the double underscores in rating__max
max_rating = App.objects.aggregate(Max('rating'))['rating__max']
return App.objects.get(rating=max_rating)
이것은 전체 테이블을 정렬하고 최상위 (약 O (n * logn))를 얻는 것보다 효율적으로 최대 요소 중 하나를 얻을 수 있도록 보장합니다.