我遇到此错误:
File "/boo/foot/routing/models.py", line 133, in indexing
contact = self.contact.get_full_name() if self.contact else '',
AttributeError: 'NoneType' object has no attribute 'get_full_name'
我的代码是:
class Visit(models.Model):
contact = models.ForeignKey(Contact, on_delete=models.SET_NULL, null=True, blank=True )
def indexing(self):
obj = VisitIndex(
meta = { 'id' : self.id },
contact = self.contact.get_full_name() if self.contact else '',
)
print(obj)
obj.save()
并将索引方法附加到post_save
信号上:
@receiver(post_save, sender = Visit)
def index_post(sender, instance, **kwargs):
instance.indexing()
我正在测试self.contact
是否不是为了得到get_full_name()
的虚假……但是,即使使用NoneType,它似乎也能达到目标。问题可能在哪里?
答案 0 :(得分:1)
您已经知道这一点,但是对于您的代码,仅当self.contact
为None
时才会发生该错误。但是,如果self.contact
为None
,则真实性测试将失败,因此无法访问该代码段。您对这两件事都是正确的。结论必须是某些东西与您的代码不一样。如果您尝试将一个最小的,可验证的示例放在一起(一小段代码,其他人可以运行该代码来重现该问题),那么您很可能会发现错误。这类似于结构化的调试过程(在找到源代码之前,缩小问题范围),当我尝试编写有关它们的好问题时,我经常发现自己发现了错误。
或者,作为第一步调试,仔细查看self.contact
是否None
会有所帮助?您还可以使测试更加精确(尽管没有必要):
def indexing(self):
print(self.contact) # is it really None?
if hasattr(self.contact, 'get_full_name'):
contact = self.contact.get_full_name()
else:
contact = ''
obj = VisitIndex(
meta={ 'id' : self.id },
contact=contact,
)
print(obj)
obj.save()
这可以说是更“ pythonic”的,并且速度更快,但我不太喜欢:
try:
get_full_name = self.contact.get_full_name
except AttributeError:
contact = ''
else:
contact = get_full_name()