這一個讓我感到困惑。請看下面的Django模型 - 代表飼養員和籠在動物園,他們是負責打掃衛生:爲什麼getattr()在屬性不存在時拋出異常?
class Zookeeper(moodels.Model):
name = models.CharField(max_length=40)
class Cage(models.Model):
zookeeper = models.ForeignKey(Zookeeper)
現在假設我想將接收器連接到Cage
的post_init
信號:
@receiver(models.signals.post_init, sender=Cage)
def on_cage_init(instance, **kwargs):
print instance.zookeeper
正如預期的那樣,由於Cage
尚未分配給Zookeeper
,這引發了一個例外。考慮以下修改接收器的身體:
print getattr(instance, 'zookeeper', 'No Zookeeper')
人們會想到這個打印「沒有動物園管理員」,因爲一個沒有被分配到該實例。相反,會發生異常:
Traceback (most recent call last):
File "../zoo/models.py", line 185, in on_cage_init
print getattr(instance, 'zookeeper', 'No Zookeeper')
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 324, in __get__
"%s has no %s." % (self.field.model.__name__, self.field.name))
DoesNotExist: Cage has no zookeeper.
爲什麼會引發異常?如果該屬性不存在,是不是getattr()
應該返回提供的默認值?我可以證明該屬性不存在:
print hasattr(instance, 'zookeeper')
...打印False
。
你也可以通過捕獲Zookeeper.DoesNotExist來避免導入ObjectDoesNotExist。 – Bobort