Как ссылаться на одну и ту же модель дважды от другой? - PullRequest
5 голосов
/ 25 мая 2011

Следующий код

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

выдает следующую ошибку:

Traceback (последний вызов был последним): файл "C: \ Program Files (x86) \ Google \google_appengine \ google \ appengine \ tools \ dev_appserver.py ", строка 4053, в _HandleRequest self._Dispatch (диспетчер, 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", строка 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_appser "ver.py ", строка 2834, в файле ExecuteOrImportScript exec module_code в файле script_module. dict Файл" D: \ svn \ language \ Web \ src \ controller.py ", строка 5, из импорта модели * Файл"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 \ tools \ dev_appserver.py ", строка 2450, в load_module возвращает self.FindAndLoadModule (подмодуль, полное имя, search_path) Файл" 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 \ tools \ dev_appserver.py", строка 2339, в описании FindAndLoadModule) Файл" C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ tools \ dev_appserver.py ", строка 1505, в функции Decorate return func (self, * args, **kwargs) Файл "C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ tools \ dev_appserver.py ", строка 2282, в описании LoadModuleRestricted) Файл" 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, base, dct) Файл "C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ ext \ db__init __. Py ", строка 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: выражение класса уже имеет свойство translation_set

Как обойти это ограничение?

Ответы [ 3 ]

11 голосов
/ 25 мая 2011

Дайте разные названия коллекций

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)

Каждый человек по умолчанию будет иметь атрибут с именем Ownercar_set по умолчанию. Если вы ссылаетесь на одну и ту же модель дважды, это создает конфликт collection_name. Таким образом, вы должны добавить collection_name для разграничения коллекций.

Более подробная информация здесь

6 голосов
/ 25 мая 2011
class Translation(db.Model):
    origin = db.ReferenceProperty(Expression, required=True, collection_name='translation_origins')
    target = db.ReferenceProperty(Expression, required=True, collection_name='translation_targets')
5 голосов
/ 25 мая 2011

Дайте им разные названия коллекций:

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')
...