반응형
장고에서 데이터베이스에서 랜덤 레코드 100개를 선택하려면 어떻게 해야 합니까?
myqueryset = Content.objects.filter(random 100)
Content.objects.all().order_by('?')[:100]
문서별 순서 참조.또한 이 접근 방식은 확장성이 좋지 않습니다(실제로는 확장성이 매우 떨어짐).많은 양의 데이터가 있을 때 랜덤 선택을 처리하는 더 나은 방법에 대해서는 이 SO 답변을 참조하십시오.
이 작업을 두 번 이상 수행하려면 데이터베이스에 이 작업을 설계해야 합니다.
한 번만 하는 거라면 무거운 위약금을 낼 여유가 있습니다.이것은 정말 좋은 랜덤 속성을 가진 정확히 100개를 얻을 수 있습니다.하지만, 이것은 많은 메모리를 사용합니다.
pool= list( Content.objects.all() )
random.shuffle( pool )
object_list = pool[:100]
테이블 전체를 검색할 수도 있기 때문에 속도가 느린 알고리즘도 있습니다.메모리를 전혀 사용하지 않고 정확하게 100이 되지 않을 수도 있습니다.
total_count= Content.objects.count()
fraction = 100./total_count
object_list = [ c for c in Content.objects.all() if random.random() < fraction ]
이 작업을 두 번 이상 수행하려면, "무작위" 값에 대해 효과적인 필터링을 허용하기 위해 내용에 속성을 추가해야 합니다.예를 들어, 이렇게 할 수도 있습니다.
class Content( models.Model ):
... etc. ...
def subset( self ):
return self.id % 32768
이렇게 하면 데이터가 32768개의 서로 다른 하위 집합으로 분할됩니다.각 부분 집합은 데이터의 1/32768'입니다.100개의 랜덤 항목을 얻으려면 데이터의 100*32768/total_count 부분 집합이 필요합니다.
total_count = Content.objects.count()
no_of_subsets= 100*32768/total_count
object_list = Content.objects.filter( subset__lte=no_of_subsets )
이것은 빠르고 재현성이 있습니다.하위 집합은 기술적으로 "무작위"가 아닌 "임의"입니다.
합니다.
import random
object_list = list(Content.objects.filter(foo=bar).values()[:100])
random.shuffle(object_list)
단일 단순 MySQL 쿼리만 실행하고 성능이 우수합니다.
언급URL : https://stackoverflow.com/questions/3506678/in-django-how-do-i-select-100-random-records-from-the-database
반응형
'source' 카테고리의 다른 글
WordPress 게시물에 미디어 업로드 (0) | 2023.10.16 |
---|---|
C 같은 언어로 ++i++를 할 수 없는 이유는 무엇입니까? (0) | 2023.10.16 |
여러 숫자의 기하평균을 계산하는 효율적인 방법 (0) | 2023.10.16 |
Xcode 5 and iOS 7 : 아키텍처와 유효한 아키텍처 (0) | 2023.10.16 |
오라클의 테이블에서 짝수 레코드를 선택하는 방법? (0) | 2023.10.16 |