2010-12-07 11 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のステートメントはかなり危険なので、キャッチするために明示的な例外を追加する必要があります。 internal_id=line[5]を使用してAuthor.MultipleItemsReturnedを発生させる状況を想像してください。あなたは間違いなく、これを隠すことができた非常に異なる問題であるため、これを上げたり、そして/またはそれを別々に扱いたいと思っています。 [OK]を、この場合には、それはprobabalyなかったでしょうが、ちょうど一般的には、空白except sがIMO :)

+0

良いアドバイス、ありがとうございました。 – AP257

1

良いものではありません、これは良く読み:

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] 

を:あなたは、その後も、

例(これらはかなり安いですが、あなたは本当に軽くてクリーンを探しているなら...)クエリインスタンスを作ることができませんでした2つのクエリが「or」演算子(その点に関してブール演算子)によって操作されたとき、それらは実行され、短絡方法で評価される。クエリには結果がある場合はtrueに、そうでない場合はfalseに評価されます。したがって、通常のクエリに結果がある場合、代替クエリは実行されません。

関連する問題