2015-06-10 2 views
0

Я пытаюсь разыменовать ссылочное поле на моем флэшке и возвращать полный объект с определенным полем разыменованного поля.Dereference a ReferenceField в Mongoengine

поле Я пытаюсь разыменованием определяется следующим образом:

vouches_received = db.ListField(db.ReferenceField('Vouch')) 

так, как я пытаюсь разыменовать это так:

unverified_vouches = [] 
for vouch in usr.vouches_received: 
    unverified_vouches.append(vouch.to_mongo()) 

usr.vouches_received = unverified_vouches 

Однако, когда я потом делать:

usr.to_json() 

На объекте я получаю сообщение ValidationError следующим образом:

ValidationError: u'{...}' is not a valid ObjectId, it must be a 
12-byte input of type 'str' or a 24-character hex string 

3 точки (...) в основном документа разыменованы, в основном это строки, поле даты и некоторые другие ссылочные поля, которые я не хочу разыменовывать.

Я знаю, что это допустимая ошибка, поскольку она ожидает ObjectID для ссылочного поля, но затем возникает вопрос, как мне удастся разыменовать это поле и вернуть документ.

Благодаря

+0

Что вы собираетесь делать с объектом usr после того, как вы его перевели в json? –

+0

верните его клиенту – Yarneo

ответ

1

The ListField ожидает элементы ObjectId и потому, что вы де ссылки их он выдает эту ошибку. Я не уверен, что это самый элегантный способ, но вы могли бы преобразовать usr.to_json() в dict, а затем заменить список vouches_received с последующим списком - я не могу проверить его, но что-то вроде этого?

user_dict = json.loads(usr.to_json()) 

unverified_vouches = [] 
for vouch in usr.vouches_received: 
    user_dict['vouches_received'].append(vouch.to_mongo()) 

usr_json = json.dumps(user_dict) 

Лучшим решением может быть использование EmbededDocument.

+0

Я действительно пробовал ваш подход, но теперь, к сожалению, я получаю сообщение об ошибке: TypeError: ObjectId ('556f474ff6e6af0009161525') не является JSON-сериализуемым Так как в объекте Vouch есть другие объекты Object – Yarneo

+0

Так получилось! вместо json.dumps мы можем сделать bson.json_util.dumps, и он решает эту проблему. Благодаря! – Yarneo

+0

Ах да, конечно. Легко забыть, что mongodb на самом деле bson –

 Смежные вопросы

  • Нет связанных вопросов^_^