5

下面的代碼如何從另一個引用相同的模型兩次?

class Translation(db.Model): 
    origin = db.ReferenceProperty(Expression, required=True) 
    target = db.ReferenceProperty(Expression, required=True) 

產生以下錯誤:

Traceback (most recent call last): File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 4053, in _HandleRequest self._Dispatch(dispatcher, self.rfile, outfile, env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3977, in _Dispatch base_env_dict=env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 588, in Dispatch base_env_dict=base_env_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3050, in Dispatch self._module_dict) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2954, in ExecuteCGI reset_modules = exec_script(handler_path, cgi_path, hook) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2834, in ExecuteOrImportScript exec module_code in script_module.dict File "D:\svn\language\Web\src\controller.py", line 5, in from model import * File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1505, in Decorate return func(self, *args, **kwargs) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2450, in load_module return self.FindAndLoadModule(submodule, fullname, search_path) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1505, in Decorate return func(self, *args, **kwargs) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2339, in FindAndLoadModule description) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1505, in Decorate return func(self, *args, **kwargs) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2282, in LoadModuleRestricted description) File "D:\svn\language\Web\src\model.py", line 24, in class Translation(db.Model): File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db__init__.py", line 500, in init _initialize_properties(cls, name, bases, dct) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db__init__.py", line 415, in _initialize_properties attr.property_config(model_class, attr_name) File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db__init__.py", line 3461, in property_config self.collection_name)) DuplicatePropertyError: Class Expression already has property translation_set

如何規避這種限制?

回答

7
class Translation(db.Model): 
    origin = db.ReferenceProperty(Expression, required=True, collection_name='translation_origins') 
    target = db.ReferenceProperty(Expression, required=True, collection_name='translation_targets') 
+2

-1不解釋這個'collection_name'事情 – bobobobo 2012-12-19 18:35:40

+0

也許你並沒有得到看時間戳 - 我的答案寫在5分鐘內有人問之後 - 這是第一個答案對於這個問題,它解決了OP問題。沒有時間額外的解釋 - 其他答案是這樣做的,我不喜歡看到重複的東西 – 2012-12-20 06:16:40

+0

因此,基本上,你跑來說'先!',然後讓別人提供高質量的答案? – OJFord 2014-11-22 18:31:16

5

給他們不同的集合名稱:

class Translation(db.Model): 
    origin = db.ReferenceProperty(Expression, required=True, 
            collection_name='origin_translation_set') 
    target = db.ReferenceProperty(Expression, required=True, 
            collection_name='target_translation_set') 
10

給不同的集合名稱

class Translation(db.Model): 
    origin = db.ReferenceProperty(Expression, required=True,collection_name='origin_translation_set') 
    target = db.ReferenceProperty(Expression, required=True,collection_name='target_translation_set') 

每db.ReferenceProperty默認創建的模型被稱爲一個名爲referencedmodelname_set集合。

對於如:

class OwnedCar(db.Model): 
    brand = db.StringProperty(required=True) 
    owner = db.ReferenceProperty(Human, required=True) 

class Human(db.Model): 
    name = db.StringProperty(required=True) 
    drives = db.ReferenceProperty(reference_class=Car) 

默認情況下,每個人都會有默認名稱ownedcar_set的屬性。如果您指的是同一個模型兩次,則會創建collection_name衝突。所以你應該添加collection_name來區分集合。

更多參考here

+0

非常好的答案 – bobobobo 2012-12-19 18:36:15

相關問題