見出し画像

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)


この記事が気に入ったらサポートをしてみませんか?