2013-10-19 3 views
3
와 임의의 레코드에 대한 빠른 방법

그래서 나는 다음과 같은 쿼리를 가지고 :장고, 집계

3 영화 이상을 가지고 임의의 사람을 끌어
Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).order_by('?')[0] 

. 그러나 장고 문서 (https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by-fields)에 명시된 바와 같이 ('?')를 사용한이 접근법은 매우 느리고 사용자가 자주 사용하는 쿼리입니다.

나는 그 쿼리의 전체 목록에 의해 생성 된 모든 기본 키를 가져 와서 txt 파일에 저장하고 매번 하나씩 임의로 선택하는 방법을 생각해 봅니다. 그러나 더 우아한 솔루션이 있는지 궁금합니다.

내가 다른 방법이해야 할 것 같다 :

num_persons 내 데이터베이스에서 사람의 수를, 그리고 사람이 쿼리와 일치하고 DoesNotExist 오류가 발생하지 않는 경우 단순히 다시 실행
Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).get(pk=randint(1,num_persons)) 

. 블록을 제외하고 시도 내

Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).get(pk=randint(1,num_persons)) 

를 /와 레코드가 존재하지 않는 경우 단지 다른 임의의 숫자와 함께 다시 시도 :

답변

0

내 게시물에 편집 같이, 나는 할 수 있습니다. 일부 행이 조각의 선 2와 3 전에 삭제하는 경우이 방법은 (실패 할 수 있다는

queryset = Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3) 
count = queryset.count() 
result = queryset[random.randint(count)] 

주, 그러나 : 행을 계산하고 무작위로 하나를 선택

1

당신은 간단한 솔루션을 사용할 수 있습니다 그래서 재 시도와 함께 try-catch에서 마지막 줄을 감쌀 수 있습니다.)

0

ORM에서 랜덤 연산자를 지정하면 꽤 명확한 두 개의 랜덤 결과를 줄 것입니다.

MyModel.objects.order_by('?')[:2] # 2 random results. 

Note: order_by('?') queries may be expensive and slow, depending on the database backend you’re using. 
+0

당신이 내 코드를 읽거나 심지어 내가 당신이 느린 것을 나는 그것을 고려도 (당신이 언급조차 무엇을) 언급 한 것을 볼이 쿼리가 여러 번 사용됩니다거야 처음에 쓴 보았다합니다. – dl8