Python 是否可以在motor中对集合进行子分类?
所以我在我的应用程序中使用,我希望创建与数据库交互的助手函数,我最初考虑使用,但我倾向于使用ORM,尽管使例程函数更容易调用会更好 让我们以一个Python 是否可以在motor中对集合进行子分类?,python,python-3.x,mongodb,mongodb-motor,Python,Python 3.x,Mongodb,Mongodb Motor,所以我在我的应用程序中使用,我希望创建与数据库交互的助手函数,我最初考虑使用,但我倾向于使用ORM,尽管使例程函数更容易调用会更好 让我们以一个upsert为例: 我可以使用以下命令编写一个upsert: await collection.update_one({'key': value}, {'set': {'key': value}}, upsert = True) 但使用起来会更容易: await collection.upsert({'key': value}, {'set': {'k
upsert
为例:
我可以使用以下命令编写一个upsert:
await collection.update_one({'key': value}, {'set': {'key': value}}, upsert = True)
但使用起来会更容易:
await collection.upsert({'key': value}, {'set': {'key': value}})
甚至是设置
方法:
await collection.set({'key': value}, {'key': value})
我有很多这样的方法,还有更多的方法,但是如果有人能给我指出正确的方向,那就太棒了
触发我问这个问题的原因是我看到中有一个document\u类
参数,允许您指定文档的返回类型。但是没有真正简单的方法来指定自定义集合类
我知道所有这些都可以使用标准约定来完成,我只是想让事情变得更简单,因为有时候可能会有一些长的过滤、更新、投影指令,我只是想实现我自己的约定
编辑
基本上,为了将更多的上下文放在这里,我正在寻找定制函数,以减少我需要反复编写的dict的数量。以更新用户点为例;我希望能够围绕update_one函数编写一种“包装器”函数,以提高多个模块的可读性和可用性
例:
尽管这不是一个完美的解决方案,但您可以通过为db对象编写包装器类来实现这一点。在某种程度上,这个类扩展了另一个类的对象,而不是类本身
db=#获取连接
类包装器:
定义初始(自我,对象):
对于输入对象中的键。\uuuu dir\uuuu():
#跳过内部方法
如果key.startswith(“\uuuuuuu”):
持续
setattr(self,key,getattr(obj,key))
异步定义更新集(键、值、**kwargs):
update_one({key:value},{'$set':kwargs})
db=包装器(db)
等待数据库更新集合(…)
注:
您需要使用包装对象来访问
update\u set
方法。因此,最好在连接时对其进行包装。尽管这不是一个完美的解决方案,但您可以通过为db对象编写包装类来实现这一点。在某种程度上,这个类扩展了另一个类的对象,而不是类本身
db=#获取连接
类包装器:
定义初始(自我,对象):
对于输入对象中的键。\uuuu dir\uuuu():
#跳过内部方法
如果key.startswith(“\uuuuuuu”):
持续
setattr(self,key,getattr(obj,key))
异步定义更新集(键、值、**kwargs):
update_one({key:value},{'$set':kwargs})
db=包装器(db)
等待数据库更新集合(…)
注:
您需要使用包装对象来访问
update\u set
方法。因此,连接时最好将其包装。我尝试了简单的子类化,但它不起作用:
class MyCollection(motor_asyncio.AsyncIOMotorCollection):
pass
my_collection = MyCollection(database=db, name='my_collection')
Traceback (most recent call last):
File "./test.py", line 13, in <module>
my_collection = MyCollection(database=db, name='my_collection')
File "/usr/local/lib/python3.6/dist-packages/motor/core.py", line 528, in __init__
super(self.__class__, self).__init__(delegate)
TypeError: __init__() missing 1 required positional argument: 'name'
我尝试了简单的子类化,但不起作用:
class MyCollection(motor_asyncio.AsyncIOMotorCollection):
pass
my_collection = MyCollection(database=db, name='my_collection')
Traceback (most recent call last):
File "./test.py", line 13, in <module>
my_collection = MyCollection(database=db, name='my_collection')
File "/usr/local/lib/python3.6/dist-packages/motor/core.py", line 528, in __init__
super(self.__class__, self).__init__(delegate)
TypeError: __init__() missing 1 required positional argument: 'name'
该字符串
super(self.\uuuuuuu class\uuuuuuu,self)
在\uuuuuu init\uuuuu
第528行的/motor/core.py中使用的问题。我的答案是试图避免递归。啊,是的,确实如此。因此,使用这个我将不得不使用My_collection=MyCollection(database=db,name='My_collection')
,而不能使用My_collection=db.collection
?注意:super()。我的答案是试图避免递归。啊,是的,确实如此。因此,使用这个我将不得不使用My_collection=MyCollection(database=db,name='My_collection')
,而不能使用My_collection=db.collection
?这就是为什么它变得“黑”了吗?注意:super()
的错误使用肯定是值得的。我在jira上就此事提出了一个问题,这不允许我说db.collection.update\u set(…)
,这就是数据库现在的工作方式。我需要一种向collectionsupdate\u one
方法添加功能的方法。这不允许我说db.collection.update\u set(…)
这就是数据库现在的工作方式。我需要一种方法向collectionsupdate\u one
方法添加功能。
#!/usr/bin/python3.6
import pymongo
from motor import motor_asyncio
class MyCollection(motor_asyncio.AsyncIOMotorCollection):
def __init__(self, *args, **kwargs):
"""Calling __init__ of parent class is failing for some reason"""
def __new__(cls, *args, **kwargs):
collection = motor_asyncio.AsyncIOMotorCollection(*args, **kwargs)
collection.__class__ = MyCollection
return collection
def my_method(self, *args, **kwargs):
print('my method', args, kwargs)
client = motor_asyncio.AsyncIOMotorClient()
db = client.db
my_collection = MyCollection(database=db, name='my_collection')
my_collection.my_method() # my_method () {}
assert db.my_collection == my_collection # passes assertion