2017-09-22 18 views
-2

我有一個Django的模型,看起來是這樣的:處理Django的模型字段可能是「無」,以避免AttributeError的

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.objects.get(first_name = "John") 

data['first_name'] = candidate.first_name 
data['last_name'] = candidate.last_name 
data['company_name'] = candidate.current_job.company 

這適用於正確填充所有值和外鍵。

然而,當任何字段的值是無,對於ForeignKey的關係特別重要,我會打一個AttributeError,是這樣的:「NoneType」對象有沒有屬性「公司」

我想正確處理模型中任何字段的「無」情況。 我現在已經發現了這兩種解決方法,但對我而言都不是很滿意。

A)我可以把一試,唯獨身邊每一個領域(這似乎不正確的,因爲我的模型去〜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)我可以將實例轉換爲這樣的字典,並使用.get(),因爲這永遠不會引發一個異常。

candidate_dict = candidate.__dict__ 
data['first_name'] = candidate_dict.get('first_name') 

是否有處理字段的值是無無對每一個單場處理一個AttributeError異常的可能性,更好的辦法?

回答

1

首先您需要檢查以下查詢是否會返回記錄。您可以嘗試抓住並處理DoesNotExist異常。

candidate = Candidate.objects.get(first_name="John") 

如果存在候補記錄,那麼你就不需要處理例外 FIRST_NAME,middle_name,姓氏領域。

由於current_job是FK字段,並且它可以爲空,因此在獲取Job模型字段數據之前,首先需要檢查候選人相關的current_job字段是否爲空

相關問題