Python 我应该如何处理'_id';与MongoDB结合使用时是否在Dataclass中?

Python 我应该如何处理'_id';与MongoDB结合使用时是否在Dataclass中?,python,mongodb,python-dataclasses,Python,Mongodb,Python Dataclasses,我有一个MongoDB,希望将每个文档存储为python数据类的实例。我对“\u id”有问题。当我创建一个本地实例时,我不想分配一个'\u id'。但是,检索文档时,实例应包含“\u id” import abc from dataclasses import dataclass @dataclass class MongoDataclass(abc.ABC): def as_json_wo_none(self): return {key: value for ke

我有一个MongoDB,希望将每个文档存储为python数据类的实例。我对“\u id”有问题。当我创建一个本地实例时,我不想分配一个'\u id'。但是,检索文档时,实例应包含“\u id”

import abc
from dataclasses import dataclass

@dataclass
class MongoDataclass(abc.ABC):

    def as_json_wo_none(self):
        return {key: value for key, value in dataclasses.asdict(self).items() if value is not None}
我的方法是将“_id”设置为无。当我将实例插入数据库时,这不起作用。值
None
作为“\u id”传递

有没有一种方法可以使用dataclass创建一个模型,允许我将本地数据和检索到的数据存储为同一类的实例

从数据类导入数据类
从输入导入列表开始
从bson导入对象ID
@数据类
类别文章:
姓名:str
数量:整数
_id:ObjectId=None
description:str=“”
插入本地实例

导入数据类
从pymongo导入MongoClient
物品=物品(name=“pen”,description=“书写设备”,数量=100)
self.client=MongoClient()
self.db=self.client.warehouse
self.collection=self.db[“articles”]
res=self.collection.insert_one(dataclasses.asdict(article))#
从dataclasses导入dataclass,asdict
从键入导入可选
@数据类
类别文章:
姓名:str
数量:整数
id:可选[int]=无
描述:str=''
def至_short_dict(自我):
结果=asdict(self)
result.pop('id'))
返回结果
#不包含“id”
输入数据={
“名称”:“笔”,“数量”:100,“说明”:“书写设备”,
}
article=article(**输入数据)
断言article.to_short_dict()=输入数据
#包含“id”
输入数据={
“id”:1,
“名称”:“笔”,“数量”:100,“说明”:“书写设备”,
}
article=article(**输入数据)
断言asdict(article)=输入数据

我试图想出一个更通用的解决方案:

我制作了一个接口
MongoDataclass
,我的所有模型都从该接口继承。接口包含一个方法,该方法返回所有键值对,其中值不是dict
None

在我看来,这是有意义的,因为MongoDB是无模式的,我不想在文档中存储任何
None
值。这也解决了“_id”的问题

import abc
from dataclasses import dataclass

@dataclass
class MongoDataclass(abc.ABC):

    def as_json_wo_none(self):
        return {key: value for key, value in dataclasses.asdict(self).items() if value is not None}

如果不设置_id会发生什么?如果我不设置'_id',将设置默认值
None
,并将其提交到数据库。这与您想要的有什么不同?我希望MongoDB创建一个ObjectId。这是Mongo的默认行为。然后使用此唯一id再次查找。服务器中的所有文档都应该有一个_id字段,您是否成功插入了一个没有_id的文档?我喜欢此功能的想法。我正在寻找一个更通用的解决方案。1.
{key:value for key,value in dataclasses.asdict(self).items()如果value不是None}
2。我同意你的第一点(更正了我的答案)。为什么要删除抽象基类?我希望与Mongo结合使用的所有数据类都从这个抽象基类继承。
abc.abc
是无用的,因为您的类中没有抽象方法