DjangoでOneToOneFieldの存在チェック

djangoのOneToOneFieldは対応するレコードがない状態で参照しようとするとDoesNotExistエラーになります。

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

    def __unicode__(self):
        return u"%s the place" % self.name


class Restaurant(models.Model):
    place = models.OneToOneField(Place, primary_key=True)
    serves_hot_dogs = models.BooleanField()
    serves_pizza = models.BooleanField()

    def __unicode__(self):
        return u"%s the restaurant" % self.place.name
>>> from apps.models import Place
>>> p = Place.objectes.create(name='osaka', address='somewhere')
>>> p.restaurant
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/yuhei/.virtualenvs/django15/lib/python2.7/site-packages/django/db/models/fields/related.py", line 279, in __get__
    raise self


try-catchすればいいんですが、インデント入るのがちょっと面倒です。
無いときはNoneを返すか、existsみたいな存在チェックだけできるメソッドがあればいいんですが、


と思ったら存在チェックにhasattrが使えることを知りました。

>>> hasattr(p, 'restaurant')
False

なるほど


参考 : One-to-one relationships | Django documentation | Django
参考 : onetoone - Check if OneToOneField is None in Django - Stack Overflow