2012-06-08 2 views
5

У меня есть mongoengine.Document подкласс Определяется пользователем.Mongoengine Document as EmbeddedDocument

class User(Document): 
    meta = {'collection': 'users', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    password = StringField(max_length=50) 
    name = StringField(max_length=50, required 

теперь я хочу, чтобы использовать его как отдельный документ со своей собственной коллекции, но я хотел бы также использовать его в качестве EmbeddedDocument как часть игры записи:

class Game(Document): 
    meta = {'collection': 'games', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    name = StringField() 
    owner = EmbeddedField(User) 

но есть проблема. Mongoengine позволяет встраивать только подклассы EmbeddedDocument. Есть ли способ решить эту проблему?

ответ

2

Попробуйте так:

class User(Document, EmbeddedDocument): 
    ... 
+1

Это не работает после 0.10 версии – user541905

1

Вы не должны быть с помощью ReferenceField?

В противном случае вы храните два отсоединенных, но логически идентичных документа.

+1

Да, я знаю. Это запланированное поведение. – yakxxx

+0

Позднее воскресение для простого вопроса, я знаю, но это ответ. +1. Никогда не храните свои данные в двух отдельных местах (если только это не является огромным, и вы уже понимаете все последствия). Очень просто расширить ссылочное поле в коде приложения, и почти так же легко пропустить некоторый крайный кейс, забыть обновить другую копию вашего объекта и в конечном итоге привести к несоответствиям. – dokkaebi

+1

@dokkaebi Я согласен с тобой 100%. Я просто работал с некоторым устаревшим кодом/базой данных и должен был взаимодействовать с ним через mongoengine. Некоторые из наших услуг попали непосредственно в базу данных. Я начал крупный рефакторинг с интерфейсом Mongo с RESTfull API для управления схемой в одном месте. Следующим шагом было улучшение структуры БД, как вы говорите, но мы несколько раз разделили процесс, чтобы лучше тестировать/контролировать его. И первым шагом было переключить каждую зависимую службу на использование RESTfull API, а затем изменить схему DB прозрачно :) – yakxxx