2009-07-29 8 views
0

장고 모델의 요소가 있는지 확인하려고합니다. Django 문서의 Making queries 섹션에서 매우 쉽게 할 수 있지만 우아한 방법을 찾을 수 없었습니다.요소가 있는지 확인하십시오.

내가 가지고있는 문제는 디렉토리에 수천 개의 스크린 샷이 있으며이를 저장해야하는 데이터베이스에 있는지 확인해야한다는 것입니다. 따라서 파일 이름을 반복하여 각 요소에 해당 요소가 있는지 살펴보고 싶습니다. Screenshot이라는 모델을 가지고 내가 만날 수있는 유일한 방법은

filenames = os.listdir(settings.SCREENSHOTS_ON_DISC) 
for filename in filenames: 
    exists = Screenshot.objects.filter(filename=filename) 
    if exists: 
     ... 

더 좋은 방법이 있습니까? 스크린 샷은 데이터베이스에 두 번 이상 올 수 있습니다 (따라서 .get을 사용하지 않았습니다).

답변

2

Screenshot 모델에 많은 특성이있는 경우 표시 한 코드가 특정 필요에 따라 불필요한 작업을 수행하고 있습니다. 예를 들어, 당신은 같은 것을 할 수 있습니다 : 당신에게 데이터베이스에있는 모든 파일 이름의 목록을 제공하고, 단지 파일 이름을 가져 오기 위해 SQL을 생성합니다

files_in_db = Screenshot.objects.values_list('filename', flat=True).distinct() 

합니다. Screenshot 객체를 만들고 채우려 고 시도하지 않습니다. 당신이

files_on_disc = os.listdir(settings.SCREENSHOTS_ON_DISC) 

이 있다면 당신은 다른의 회원을 찾고 하나 개의 목록을 반복, 또는 하나를 만들거나 세트로 두 목록은

1

당신은 시도 할 수 있습니다 : 당신이해야 할 모든 스크린 샷의 목록을 제공합니다

Screenshot.objects.filter(filename__in = filenames) 

합니다. 두 목록을 비교하고 두 목록 사이에 어떤 것이 있는지 확인할 수 있습니다. 그렇게하면 시작할 수 있지만 성능/사용에 대한 쿼리를 조정할 수 있습니다.

1

이 쿼리는 모든 파일을 얻을 수 등 일반 회원을 찾을 수 데이터베이스와 파일 시스템에 있습니다 :

discfiles = os.listdir(settings.SCREENSHOTS_ON_DISC) 

filenames = (Screenshot.objects.filter(filename__in=discfiles) 
           .values_list('filename', flat=True) 
           .order_by('filename') 
           .distinct()) 

참고 : order_by에 유의하십시오. 모델 정의에 주문이 지정되어있는 경우 distinct을 사용하면 예상 한 것을 반환하지 않을 수 있습니다. 이 여기에 설명되어 있습니다 :

그래서 다음 순서가 명시 적으로 만드는 쿼리를 실행합니다.

관련 문제