我有一个看起来像这样的Django模型:
class Candidate(models.Model):
first_name = models.CharField(max_length=30, blank=True, null=True)
middle_name = models.CharField(max_length=30, blank=True, null=True)
last_name = models.CharField(max_length=30, blank=True, null=True)
current_job = models.ForeignKey(
Job,
on_delete=models.SET_NULL,
blank=True,
null=True,
default=None,
)
我得到一个“Candidate”的实例,并尝试将一些值保存到字典中
candidate = Candidate.objects.get(first_name = "John")
data['first_name'] = candidate.first_name
data['last_name'] = candidate.last_name
data['company_name'] = candidate.current_job.company
当正确填充所有值和外键时,这可以正常工作。
但是,当字段的任何值为None时,对于ForeignKey关系尤其重要,我会遇到一个AttributeError,类似于:'NoneType'对象没有属性'company'
我想正确处理模型中任何字段的“无”情况。 我现在已经找到了这两种解决办法,但对我来说似乎都不令人满意。
A)我可以尝试 - 除了EACH和EVERY字段(这似乎不正确,因为我的模型达到~20个字段)
try:
data['first_name'] = candidate.first_name
data['last_name'] = candidate.last_name
except:
pass
try:
data['company_name'] = candidate.current_job.company
B)我可以将实例转换为这样的dict并使用.get(),因为它永远不会引发异常。
candidate_dict = candidate.__dict__
data['first_name'] = candidate_dict.get('first_name')
有没有更好的方法来处理字段值为None的可能性而不处理每个字段上的AttributeError异常?
答案 0 :(得分:1)
首先您需要检查以下查询是否会返回记录。您可以放入try catch并处理candidate = Candidate.objects.get(first_name="John")
异常。
$orders = Bigcommerce::getOrders(array('sort' => 'date_created:desc'));
print_r($orders);
如果候选记录存在则您不需要处理异常 first_name,middle_name,last_name字段。
由于current_job是FK字段并且它可以为null,因此在获取Job模型字段数据之前,首先需要检查候选相关的current_job字段是否为空