2012-12-01 57 views
1

我有一個沒有父母沒有意義的模型。有沒有辦法強制實體擁有父母?如果孩子實體在沒有父母的情況下被實例化,那麼我想要提出異常,類似於所需的屬性。要求在谷歌應用程序引擎的實體父母

class Parent(db.Model): 
    eye_color = db.StringProperty(required=True) 

class Child(db.Model): 
    pass 

不會引發異常:

mom = Parent(eye_color='purple') 
jimmy = Child(parent=mom) 

拋出一個例外:

mom = Parent(eye_color='purple') 
jimmy = Child() 

回答

2

我沒有親自試過,但你應該能夠覆蓋__init__爲兒童類並檢查以確保父項不是無。像這樣:

class Child(db.Model): 
    pass 

    def __init__(self, 
       parent=None, 
       key_name=None, 
       _app=None, 
       _from_entity=False, 
       **kwds): 
    if not parent: 
     raise ValueError('parent is required.') 
    super(Did, self).__init__(parent=parent, key_name=key_name, app=_app, 
           _from_entity=_from_entity, **kwds) 
+0

對我來說夠好!但有一個問題。你是否打算給超級孩子打電話,不是嗎? –

+0

這實際上不建議,請參閱此SO問題的接受解決方案http://stackoverflow.com/questions/3279833/how-to-use-a-custom-init-of-an-app-engine-python-model -class- – payala

0

有了NDB,您可以使用預放鉤的方法來檢查,如果該實例有一個家長和拋出一個異常,如果它不。我看到你正在使用舊的db模塊,我相信它沒有相同的鉤子方法。你應該考慮轉向更好和更好的ndb數據存儲API,你會得到其他好處,比如自動緩存等等。

NDB:https://developers.google.com/appengine/docs/python/ndb/overview

NDB模型掛鉤:https://developers.google.com/appengine/docs/python/ndb/entities#hooks

編輯:我只是提醒的是,你可以做一些類似與DB API的NDB模式掛鉤的東西。與Nick Johnson一樣,在this中有很好的解釋。

+0

是的,與db相比,ndb非常棒。我在其他項目中使用它。不幸的是,我現在沒有時間花費所有這些代碼。 –

+0

但是,如果你可以使用db來實現類似基於鉤子的解決方案,它會是一個解決方案嗎? – payala

+0

絕對!感謝您的信息。如果我使用ndb,這正是我所期待的。 –