2013-08-15 3 views
0

객체가 있거나 존재하지 않을 수 있습니다. 이 사실로 인해 try/except 블록에서 명령문을 래핑했습니다. 내가이 상황에서 조건을 제외하고에 넣어 아무 상관이 없기 때문에처리 방법 가능한 객체가 장고에 존재하지 않습니다.

try: 
     generic_type = ContentType.objects.get_for_model(myentity) 
     my_object = MyObject.objects.filter(content_type__pk=generic_type.id, object_id=myentity.id)[0] 
except: 

물어 이유는,하지만 장고/파이썬가 필요합니다.

이 상황을 처리하는 적절한 방법입니까? 그렇다면 Except 이후에 무엇을 넣어야합니까?

+0

'except'는'try' 블록이 실패한 상황에서 여러분이 넣는 것입니다. 다른 말로하면 :'try' 블록이 에러를 던질 때 프로그램이 무엇을하기를 원합니까? – erewok

+0

내 프로그램으로 옮겨 다른 무관 한 코드를 실행하고 싶습니다 – Atma

+1

그러면 'pass'에 대한 사용자 Wooble의 코멘트가 거기에 포함됩니다. 그러나 거기에 당신의 구성은 일단 당신이 거기에'통과 '를 넣으면 모든 종류의 오류를 숨길 수 있습니다. 왜냐하면 부분적으로 당신이 생각할 오류를 지정하지 않기 때문입니다. 당신은 그들 모두를 잡으려고합니다. – erewok

답변

3

잡으려고 실제 예외를 지정해야하지만 아무 것도하지 않으려면 명령문이 필요한 모든 위치에서 pass 문을 사용할 수 있습니다.

except WhateverExceptionGetsRaised: 
    pass 
0

"PK"를 기준으로 개체를 검색하는 경우 하나의 개체 만 반환합니다. 여러 개의 필터가 필요 없습니다. 대신에 :

my_object = MyObject.objects.filter(content_type__pk=generic_type.id, object_id=myentity.id)[0] 

당신은 사용할 수 있습니다

my_object = MyObject.objects.get(content_type__pk=generic_type.id, '') 

당신은 사용하는 것이이 당신이 첫 번째 개체가 지정된 취득에 실패했을 경우는, 따라서 이중 따옴표를 아무것도 돌려주지 않는 것인지. 이것은 try/except 패턴보다 더 간결한 대답 일 수 있습니다.

filter()[0] vs. get() 

모두가 하나 개의 객체를 반환하지만 get() 만 개체를 ​​반환으로 QuerySet 오브젝트 유형, filter()[0] 반환, 그래서 이것은 고려해야 할 또 다른 일이 : 또한, 사용.

관련 문제