首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3、ODM (umongo)、关系字段的困难

Python 3、ODM (umongo)、关系字段的困难
EN

Stack Overflow用户
提问于 2020-04-17 08:35:40
回答 1查看 98关注 0票数 0

我在umongo中使用关系字段时遇到了一些问题。每个文档定义都在一个单独的文件中。在本例中,我有两个基本实体: account和target。每个目标都有一个对帐户的引用。

// account/schema.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
     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方法时,我总是得到:

代码语言:javascript
复制
umongo.exceptions.NotRegisteredDocumentError: Unknown document class `AccountSchema`

如果我尝试传入类对象AccountSchema,则会得到相同的错误

代码语言:javascript
复制
from models.account.schema import AccountSchema

@instance.register
class TargetSchema(Document):
    account = fields.ReferenceField(AccountSchema, required=True)

我的感觉是这与我实例化/导入实例的顺序有关,但是尝试移动它们,例如将它们移动到__init__.py中,似乎不会改变任何事情。

或者如何在每个模式定义中:

代码语言:javascript
复制
db = MongoClient(mongo_url).target
instance = Instance(db)

我所能找到的所有示例都将referencefield类定义保存在同一个文件中,所以我不太确定如何让不同的注册实例“知道”彼此。

EN

回答 1

Stack Overflow用户

发布于 2020-04-17 10:40:42

因此,问题不在于将所有类声明和注册到同一个数据库实例。

例如,在我移动的models文件夹的__init__.py中:

代码语言:javascript
复制
from umongo import Instance, Document, fields, validate
from pymongo import MongoClient
db = MongoClient(mongo_url).mydb
instance = Instance(db)

然后在每个模式文件中:

代码语言:javascript
复制
from models import db
from models import instance
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61262319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档