2011-04-20 36 views
3

我想寫一些這樣的代碼:檢查非空的字段爲空(Django的)

class SomeModel(models.Model): 

    field = models.ForeignKey(SomeOtherModel) 

    def __init__(self, *args, **kwargs): 
     super(SomeModel, self).__init__(*args, **kwargs) 
     if self.field is None: 
      self.field = SomeOtherModel() 

    ... 

然而,這引起了self.field.rel.to.DoesNotExist。 Django的代碼是說的很清楚:

class ReverseSingleRelatedObjectDescriptor(object): 

    def __get__(self, instance, instance_type=None): 

     ... 

     if val is None: 
      # If NULL is an allowed value, return it. 
      if self.field.null: 
       return None 
      raise self.field.rel.to.DoesNotExist 

我幾乎可以肯定這個問題之前已經提出,但不知何故,我無法找到任何將匹配特定用例。一個明顯的解決方法當然是使字段可以爲空,但據我所知,實際上會對數據庫模式產生影響,我也喜歡Django提供的完整性檢查。另一個是捕捉異常並進行適當處理。但是這增加了很多樣板代碼。特別是當有像這樣的多個字段時(每個字段都有一個單獨的try...except塊 - 現在很醜)。你會建議什麼?

編輯:另一件事 - 我可以使用initial但是,當涉及到外鍵時,這是相當有限。我並不總是知道創作時我想要的那種默認。然而,我會在初始化階段知道它。此外,它可能依賴於其他領域的價值。

回答

10

檢查它是否具有設置屬性 -

if hasattr(self, 'field', False) 
+2

我認爲它應該是'hasattr(self,'field')',但是這是有效的。謝謝。 – julkiewicz 2011-04-20 12:49:32

+0

hasattr預計2個參數,得到3 – 2014-10-20 17:29:24

0

指在形成場正確的方法是這樣的:
self.fields['myfield']
所以,在你的情況下,空校驗應該是這樣的
self.fields['myfield'].value is None

另注

,不要使用保留/接近像「田」保留字命名的領域。

+0

我想不出任何有意義的意思,在Python中「字段」是「保留」的。在Python中,對象由屬性和方法組成。 – 2011-04-20 10:11:59

+0

沒有什麼可以與'領域'打破。但我在談論DJango。這裏的表單有字段屬性,並再次使用類似的詞來表示自定義項目的代碼混淆其他程序員。好/適當的變量命名總是容易閱讀和理解。 – 2011-04-20 10:33:07

+0

這只是一個例子。在我的實際模型中,字段名稱完全不同。 – julkiewicz 2011-04-20 12:41:17