Python 3, ODM (umon go), сложность с полями отношений - PullRequest
0 голосов
/ 17 апреля 2020

У меня возникли проблемы с настройкой полей отношений в 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 в одном файле, поэтому я не совсем уверен, как сделать разные зарегистрированные экземпляры «осведомленными» друг о друге.

1 Ответ

0 голосов
/ 17 апреля 2020

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

т.е. в __init__.py для папки моделей, которую я переместил:

from umongo import Instance, Document, fields, validate
from pymongo import MongoClient
db = MongoClient(mongo_url).mydb
instance = Instance(db)

, затем в каждом файле схемы:

from models import db
from models import instance
...