Как дважды сослаться на одну и ту же Модель из другой?

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

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

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

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

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


person Jader Dias    schedule 25.05.2011    source источник


Ответы (3)


каждый db.ReferenceProperty по умолчанию создает коллекцию с именем referencedmodelname_set в указанной модели.

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

Например:

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

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)

Дополнительные сведения см. здесь

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

person Abdul Kader    schedule 25.05.2011

Возможно, вам не удалось увидеть временные метки - мой ответ был написан через 5 минут после того, как был задан вопрос - это был первый ответ на вопрос, он решил проблему OP. Не было времени для дополнительных объяснений - есть другие ответы, которые делают это, мне не нравится видеть повторяющиеся вещи

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')
person Drew Sears    schedule 25.05.2011

person    schedule
comment
То есть вы поспешили сказать «Первый!», А потом оставили других, чтобы они давали качественные ответы? - person Tudor Constantin; 20.12.2012
comment
да, по сути, я поспешил дать ему решение его проблемы, чтобы избавить его от разочарований, вызванных кодом, который не работает. - person OJFord; 22.11.2014
comment
Отслеживание (последний вызов последним): файл "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 ", строка 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, в ExecuteOrImportS cript 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, в Decorate return func (self, * args, ** kwargs) File" C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ tools \ dev_appserver.py ", строка 2450, в load_module return self.FindAndLoadModule (submodule, fullname, search_path) File" C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ tools \ dev_appserver.py " , строка 1505, в Decorate return func (self, * args, ** kwargs) File "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) File " 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, имя, базы, dct) Файл "C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ ext \ db__init __. py", строка 415, в атрибуте _initialize_properties. 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 - person Tudor Constantin; 23.11.2014