[django] Django에서 SELECT MAX를 수행하는 방법은 무엇입니까?

필드의 최대 값을 제공하기 위해 쿼리를 실행하는 방법에 대한 개체 목록이 있습니다.

이 코드를 사용하고 있습니다.

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


답변

내 프로젝트에 대해 이것을 테스트했으며 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))를 얻는 것보다 효율적으로 최대 요소 중 하나를 얻을 수 있도록 보장합니다.


답변