9

在舊的谷歌appengine數據存儲API「必需」和「默認」可以一起用於屬性定義。使用NDB我得到一個爲什麼在ndb中需要和默認是互斥的?

ValueError: repeated, required and default are mutally exclusive. 

示例代碼:

from google.appengine.ext import ndb 
from google.appengine.ext import db 

class NdbCounter(ndb.Model): 
    # raises ValueError 
    count = ndb.IntegerProperty(required=True, default=1) 

class DbCounter(db.Model): 
    # Doesn't raise ValueError 
    count = db.IntegerProperty(required=True, default=1) 

我想實例化一個計數器,而無需指定值。我也想避免有人把這個值覆蓋到None。上面的例子被構造。我可能沒有必要的屬性生活,而是添加一個增量()方法。儘管如此,我還是沒有看到爲什麼要求和默認是相互排斥的。

它是一個錯誤或功能?

回答

10

我認爲你是對的。也許我在寫代碼的那部分時感到困惑。 「required = True」的意思是「不允許寫入None」,所以應該可以將其與默認值結合使用。請在NDB跟蹤器中提出功能請求:http://code.google.com/p/appengine-ndb-experiment/issues/list

請注意,對於重複的屬性,事情會更加複雜,重複可能會繼續與要求或默認不兼容,即使實現了上述功能。

+0

謝謝。我創建了http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=236問題 – bastian

0

林不知道什麼目的,繼承人是appengine.ext.ndb.model.py的「解釋」:

The repeated, required and default options are mutually exclusive: a 
repeated property cannot be required nor can it specify a default 
value (the default is always an empty list and an empty list is always 
an allowed value), and a required property cannot have a default. 

要小心,NDB有一些其他的真的很煩人的行爲(文本> 500個字節不可能沒有猴子修補expando模型,通過.IN([])過濾引發異常,..)。 所以除非你需要通過緩存提高速度,否則你應該考慮使用ext.db atm。

+0

所以這似乎是一個概念性的錯誤。我沒有看到這個限制的理由。限制應該是,如果需要,默認值不能爲None = True。 – bastian

+0

對我來說這是有道理的,因爲它是。如果你需要一個值,那麼爲什麼還要指定一個默認值,因爲在這種情況下你可能沒有required = True(就好像你沒有別的辦法,只是創建並保存模型,因爲它有默認值)。 required = True是對我的一個提醒,如果我試圖在這個領域沒有價值的情況下保存這個模型,它就會失敗,而如果我提供一個默認值,它永遠不會失敗,對我而言,所需的。 –

相關問題