2010-12-07 3 views

답변

5
author_id = line[5] 
try: 
    author = Author.objects.get(internal_id=author_id) 
except Author.DoesNotExist: #blank excepts are bad and hide errors. 
    author_id = author_mapper[line[5]] 
    author = Author.objects.get(internal_id=author_id) 

귀하의 버전은 재즈에 충분했습니다. 그러나 공백 인 except 문은 다소 위험 할 수 있으므로 catch에 대한 명시 적 예외를 추가해야합니다. internal_id=line[5]을 사용하는 상황이 Author.MultipleItemsReturned 인 경우를 상상해보십시오. 당신은 분명히 이것을 올리기를 원하거나 그것을 별개로 다루기를 원했을 것입니다. 그것은 그것이 숨겨진 매우 다른 문제이기 때문입니다. 좋아,이 경우에는 probabaly하지 않았을 것이다, 그러나 다만 일반적으로 빈 except들이 더 잘 읽고 :

+0

좋은 조언, 감사합니다. :) – AP257

1

IMO 잘되지 않습니다 :

author_id = line[3] 
alternate_id = author_mapper[author_id] 
query = Author.filter(internal_id = author_id) 
alternate_query = Author.filter(internal_id = alternate_id) 
query = query or alternate_query 
author = query[0] 

일부 노트 : 당신이해야한다 이러한 내부 ID가 고유하다는 것을 보증 할 수 있습니다 (get 메소드를 사용하기 때문에 가정하는 것이 안전합니다). 첫 번째 쿼리에 결과가있는 동안에는 대체 쿼리가 실행되지 않습니다. 추가 개선은 메소드가 질의와 대체 질의를 반환하게하는 것일 수 있습니다. 경우 사람에

author_id = line[5] 
query = RegularQuery(author_id) or AlternateQuery(author_id, author_mapper) 
author = query[0] 

무엇에 안개가 : 당신은 심지어

예 (... 당신이 정말로 빛과 청소를 찾고 있다면이 상당히 저렴하지만) 쿼리 인스턴스를 만들 수 없습니다 두 개의 쿼리가 "or"연산자 (해당 문제에 대한 부울 연산자)에 의해 연산 될 때 단락 회로 방식으로 실행되고 평가됩니다. 쿼리는 결과가 있으면 true로, 그렇지 않은 경우에는 false로 평가됩니다. 따라서 일반 쿼리에 결과가 있으면 대체 쿼리가 실행되지 않습니다.

관련 문제