У меня возникли проблемы с настройкой полей отношений в umon go. Каждое определение документа находится в отдельном файле. В этом примере у меня есть две основные c сущности, учетная запись и цель. каждая цель имеет ссылку на учетную запись.
// account / schema.py
from datetime import datetime
from pymongo import MongoClient
from umongo import Instance, Document, fields, validate
import os
log = Config.config_logger(__name__)
mongo_url = os.environ.get('MONGO_URL')
db = MongoClient(mongo_url).mydb
instance = Instance(db)
@instance.register
class AccountSchema(Document):
user_id = fields.StringField(required=True, unique=True)
user_name = fields.StringField(required=True)
account_type = fields.StringField(required=True)
class Meta:
collection = db.account
# Make sure that unique indexes are created
AccountSchema.ensure_indexes()
try:
sub = AccountSchema(user_id='my8htwwi', account_type='SUBSCRIPTION', user_name='myuser')
sub.commit()
freeloader = AccountSchema(user_id='ouygouyg', account_type='FREE', user_name='myotheruser')
freeloader.commit()
except Exception:
log.info('account already created')
Я добавил некоторые ручные данные там внизу, и это прекрасно работает, когда я запускаю этот файл или импортирую его в другое место.
Я определяю вторую схему объекта для 'target'
// target / schema.py
from datetime import datetime
from pymongo import MongoClient
from umongo import Instance, Document, fields, validate
import os
mongo_url = os.environ.get('MONGO_URL')
db = MongoClient(mongo_url).mydb
instance = Instance(db)
@instance.register
class TargetSchema(Document):
account = fields.ReferenceField('AccountSchema', required=True)
date = fields.DateTimeField(
default=lambda: datetime.utcnow(),
allow_none=False
)
somefield = fields.IntegerField(required=True)
value = fields.IntegerField(required=True)
class Meta:
collection = db.target
# Make sure that unique indexes are created
TargetSchema.ensure_indexes()
service.py
from models.account.schema import AccountSchema
from models.target.schema import TargetSchema
class Service:
self._odm = TargetSchema
....
def save_test(data):
account = AccountRepo().find({'user_id': self._user_id})
# account returns a valid object
item = self._odm(
account=account,
somefield=123123,
value=1234
)
return item.commit()
Когда Я вызываю метод save_test, продолжаю получать:
umongo.exceptions.NotRegisteredDocumentError: Unknown document class `AccountSchema`
Я получаю ту же ошибку, если пытаюсь передать вместо этого объект класса AccountSchema
from models.account.schema import AccountSchema
@instance.register
class TargetSchema(Document):
account = fields.ReferenceField(AccountSchema, required=True)
Мне кажется, что это для того, чтобы я создал / импортировал экземпляры, но попытка переместить их, например, в __init__.py
, похоже, ничего не меняет.
Или как в каждом определении схемы:
db = MongoClient(mongo_url).target
instance = Instance(db)
Все примеры, которые мне удалось найти, сохраняют определение класса referencefield в одном файле, поэтому я не совсем уверен, как сделать разные зарегистрированные экземпляры «осведомленными» друг о друге.