source

장고에서 데이터베이스에서 랜덤 레코드 100개를 선택하려면 어떻게 해야 합니까?

factcode 2023. 10. 16. 22:07
반응형

장고에서 데이터베이스에서 랜덤 레코드 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

반응형