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