django DoesNotExistはいらない
ハンターハンターで、ヒソカがゴトーを殺すときに言った、「死神クイズに正解者はいらない」っていうノリで読んでもらいたいです。
さて、本題です。
Djangoで、「モデルクラス.objects.get(条件)」といった形でクエリを発行した場合、ヒットしなかった場合は「モデルクラス.DoesNotExist」という例外が発生します。これを「try-except」で毎回ハンドリングするのは結構面倒です。なので、「get_or_none」という、ヒットしたらモデルを、ヒットしなかったら「None」を返すメソッドを用意しておくと便利です。
「get_or_none」はカスタムマネージャーを使って、以下のように定義するのがきれいなのかなと思います。
from django.db import models
class BaseManager(models.Manager):
def get_or_none(self, **kwargs):
"""
検索にヒットすればそのモデルを、しなければNoneを返します。
"""
try:
return self.get_queryset().get(**kwargs)
except self.model.DoesNotExist:
return None
class Foo(models.Model):
objects = BaseManager()
name = models.CharField(max_length=200)
slug = models.SlugField()
# DBにid=1のレコードがあればそのモデル、なければNoneを返します。
foo = Foo.objects.get_or_none(id=1)
この記事が気に入ったらサポートをしてみませんか?