gpt4 book ai didi

python - MongoAlchemy StringField 意外替换为 QueryField?

转载 作者:行者123 更新时间:2023-12-02 16:15:45 27 4
gpt4 key购买 nike

在使用 MongoAlchemy 时,我一直在与一个奇怪的错误作斗争。

我的 Participant 模型上有一个 name = db.StringField()。大多数时候它工作正常,但由于某种原因,该字段偶尔会被 QueryField 覆盖。如果我从模块中重新加载我的 Participant 类,它会在一段时间内正常工作,但随后会再次崩溃。

这是发生此情况的终端 session :

In [99]: from webapp.models import *

In [100]: Participant.by_name('yaronTesting') # My own method, which filters by name
Out[100]: <Participant yaronTesting>

In [101]: Participant.query.all()
Out[101]: [<Participant name>, <Participant name>]

# What?

In [102]: Participant.query.all()[0]
Out[102]: <Participant name>

In [103]: Participant.query.all()[0].name
Out[103]: QueryField(name)

In [104]: from webapp.models import Participant

In [105]: Participant.query.all()
Out[105]: [<Participant yaronTesting>, <Participant tsviki>]

In [106]: Participant.query.all()[0].name
Out[106]: u'yaronTesting'

我是 MongoDB 新手,对于将其投入生产感到非常紧张 - 有谁知道幕后会发生什么吗?

因此,为了回应杰夫的评论,我有另一个 session ,其中问题发生在查询之外:

In [168]: tsviki_old
Out[168]: <Participant name>

In [169]: tsviki_old.mongo_id
Out[169]: ObjectId('53f4f27a6c4dae23aba41419')

In [170]: tsviki_new = Participant.by_name('tsviki')
Out[170]: <Participant tsviki>

In [171]: tsviki_new.mongo_id
Out[171]: ObjectId('53f4f27a6c4dae23aba41419')

In [172]: tsviki_old.mongo_id
Out[172]: ObjectId('53f4f27a6c4dae23aba41419')

In [173]: tsviki_old
Out[173]: <Participant name>

In [174]: tsviki_new
Out[174]: <Participant tsviki>

In [175]: tsviki_old.name
Out[175]: QueryField(name)

In [176]: tsviki_new.name
Out[176]: u'tsviki'

In [179]: tsviki_old.created
Out[179]: QueryField(created)

In [180]: tsviki_old.modified
Out[180]: QueryField(modified)

In [181]: tsviki_old.sessions
Out[181]: QueryField(sessions)

# It happened again! To tsviki_new!

In [182]: tsviki_new.created
Out[182]: QueryField(created)

In [183]: tsviki_new
Out[183]: <Participant name>

In [184]: tsviki_new.name
Out[184]: QueryField(name)

In [185]: tsviki_new.mongo_id
Out[185]: ObjectId('53f4f27a6c4dae23aba41419')

我不记得在进行最后一个 session 时做过任何其他事情,除了可能曾经保存过一个文件。似乎存在一些与时间相关的组件——如果我离开解释器一段时间然后再回来,通常会发生这种情况,但我无法确定是什么特定行为导致了这种情况。

另外,仅供引用:

@classmethod
def by_name(cls, name):
return Participant.query.filter({'name': name}).first()

最后,当我将 name 字段添加到 __init__ 函数并尝试实例化一些对象时,出现错误(早期版本没有向 init 传递任何参数) :

In [36]: Participant.query.all()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-36-310f11265a76> in <module>()
----> 1 Participant.query.all()

/Users/kronosapiens/Dropbox/Documents/Development/code/environments/pm/lib/python2.7/site-packages/mongoalchemy/query.pyc in all(self)
177 def all(self):
178 ''' Return all of the results of a query in a list'''
--> 179 return [obj for obj in iter(self)]
180
181 def distinct(self, key):

/Users/kronosapiens/Dropbox/Documents/Development/code/environments/pm/lib/python2.7/site-packages/mongoalchemy/query.pyc in next(self)
410
411 def next(self):
--> 412 return self._next_internal()
413 __next__ = next
414

/Users/kronosapiens/Dropbox/Documents/Development/code/environments/pm/lib/python2.7/site-packages/mongoalchemy/query.pyc in _next_internal(self)
421 if obj:
422 return obj
--> 423 value = self.session._unwrap(self.type, value, fields=self.fields)
424 if not isinstance(value, dict):
425 self.session.cache_write(value)

/Users/kronosapiens/Dropbox/Documents/Development/code/environments/pm/lib/python2.7/site-packages/mongoalchemy/session.pyc in _unwrap(self, type, obj, **kwargs)
333 def _unwrap(self, type, obj, **kwargs):
334 obj = type.transform_incoming(obj, session=self)
--> 335 return type.unwrap(obj, session=self, **kwargs)
336
337 @property

/Users/kronosapiens/Dropbox/Documents/Development/code/environments/pm/lib/python2.7/site-packages/mongoalchemy/document.pyc in unwrap(cls, obj, fields, session)
494 if fields is not None:
495 params['retrieved_fields'] = fields
--> 496 obj = cls(loading_from_db=True, **params)
497 obj._mark_clean()
498 obj._session = session

/Users/kronosapiens/Dropbox/Documents/Development/code/jobs/paragon/webapp/webapp/models.py in __init__(self, name, **kwargs)
319
320 def __init__(self, name, **kwargs):
--> 321 super(Participant, self).__init__(
322 name=name,
323 **kwargs)

TypeError: super(type, obj): obj must be an instance or subtype of type

最佳答案

MongoAlchemy 作者在这里。我对 flask 集成不是很熟悉,因为其他人写了它,但这里必须发生的是 all() 返回 class 参与者的实例而不是 实例 根据数据库数据创建。

如果您可以提供一个完整的可运行示例,我可以为您提供更多详细信息,但这就是我从您的问题中所能收集到的全部信息。

关于python - MongoAlchemy StringField 意外替换为 QueryField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25413814/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com