如何从另一个模型引用相同的模型两次?

Jad*_*ias 5 python google-app-engine foreign-keys google-cloud-datastore

以下代码

class Translation(db.Model):
    origin = db.ReferenceProperty(Expression, required=True)
    target = db.ReferenceProperty(Expression, required=True)
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

回溯(最近一次调用最后一次):文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第4053行,_HandleRequest self._Dispatch(dispatcher,self.rfile,outfile) ,env_dict)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第3977行,在_Dispatch base_env_dict = env_dict中)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第588行,在Dispatch base_env_dict = base_env_dict中)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",line 3050,在Dispatch self._module_dict)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第2954行,在ExecuteCGI中reset_modules = exec_script(handler_path,cgi_path,hook)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第2834行,在script_module的ExecuteOrImportScript exec module_code中.dict 文件"D:\ svn\language\Web\src\controller.py",第5行,来自模型导入*文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver". py",第1505行,在Decorate中返回func(self,*args,**kwargs)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第2450行,在load_module return self.FindAndLoadModule(submodule,fullname,search_path)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第1505行,在Decorate中返回func(self,*args) ,**kwargs)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第2339行,在FindAndLoadModule描述中)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\tools\dev_appserver.py",第1505行,装饰返回功能(self,*args,**kwargs)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine \在LoadModuleRestricted desc中的tools\dev_appserver.py",第2282行 ription)文件"D:\ svn\language\Web\src\model.py",第24行,在类Translation(db.Model)中:文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\ext\db__init __.py",第500行,在init _initialize_properties(cls,name,bases,dct)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\ext\db__init __.py",line 415,在_initialize_properties attr.property_config(model_class,attr_name)文件"C:\ Program Files(x86)\ Google\google_appengine\google\appengine\ext\db__init __.py",第3461行,在property_config中 self.collection_name))DuplicatePropertyError:Class Expression已经具有属性translation_set

如何规避这个限制?

Abd*_*der 11

提供不同的集合名称

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')
Run Code Online (Sandbox Code Playgroud)

默认情况下,每个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)
Run Code Online (Sandbox Code Playgroud)

默认情况下,每个人都有一个名为ownedcar_set的属性.如果要两次引用同一模型,则会创建collection_name冲突.因此,您应该添加collection_name以区分集合.

更多参考这里


Tud*_*tin 6

class Translation(db.Model):
    origin = db.ReferenceProperty(Expression, required=True, collection_name='translation_origins')
    target = db.ReferenceProperty(Expression, required=True, collection_name='translation_targets')
Run Code Online (Sandbox Code Playgroud)

  • -1表示没有解释这个`collection_name`的事情 (2认同)

Dre*_*ars 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')
Run Code Online (Sandbox Code Playgroud)