处理可能为“无”的Django模型字段以避免AttributeError

时间:2017-09-22 04:06:53

标签: python django

我有一个看起来像这样的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异常?

1 个答案:

答案 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字段是否为空

相关问题