オブジェクトが存在するかどうかを確認し、オブジェクトを返す必要があります。次に、それに基づいてアクションを実行します。404を返さずにそれを行う正しい方法は何ですか?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
オブジェクトが存在するかどうかを確認し、オブジェクトを返す必要があります。次に、それに基づいてアクションを実行します。404を返さずにそれを行う正しい方法は何ですか?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
if listing:
必要がありelse:
ます。
回答:
あなたが404を与えられないなら、私は404ラッパーを使用しません。それは意図の誤用です。代わりに、DoesNotExistをキャッチしてください。
try:
listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
listing = None
exists()
は、オブジェクトを操作する必要がある場合よりもうまく機能します。
values_list('id', flat=True)
です。存在するかどうかを確認する必要がある場合listing = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
は、オブジェクト自体ではなくモデルを参照していることです。なぜそうではないのRealEstateListing.objects.get(slug_url=slug).DoesNotExist
ですか?
次のこともできます:
if not RealEstateListing.objects.filter(slug_url=slug).exists():
# do stuff...
try: except:
ブロックを使用する方が明確な場合もあれば、ワンライナーexists()
でコードをより見やすくする場合もあります...すべてはアプリケーションロジックに依存します。
exists()
動作しないと思いますよget()
ね?
get()
ます。後で行うと、2番目のクエリがデータベースに送信されます。
try-except
しexists()
ます。
listing = RealEstateListing.objects.filter(slug_url=slug).first()
if listing:
.exists()
。SOでは、物事をどのように実行するかについて複数の異なる答えを持つことが良い考えだと思います。おそらく、オブジェクトが存在する場合はそれも使用したい人に向いています。try / exceptを回避する必要があるかどうかを判断するためのルールは作成しません。非常にコンパクトなコードを作成したいだけの場合など、良いこともあれば悪いこともあります。