将 _id 从 ObjectId 更改为正常的唯一自动增量整数
Posted
技术标签:
【中文标题】将 _id 从 ObjectId 更改为正常的唯一自动增量整数【英文标题】:Change _id from ObjectId to normal unique auto increment integer 【发布时间】:2022-01-19 01:48:00 【问题描述】:我对 Django 和 Web 开发还很陌生,所以所有这些对我来说都是新的,因为我正在学习。
我最近有一个 Django 站点设置并使用 Postgresql。当我创建它时,我把事情复杂化了,需要特别使用 Postgresql,因为它有一个 SQLite 没有的字段。无论如何,我将重做它(v2)并想转换为 MongoDB。现在我已经设置好了所有东西,但是我注意到当我在管理面板中从我的模型创建新项目时,它会在数据库中获得_id:ObjectId("61ba69238db76b91b4bf42f1")
。我猜这是主键?但是,据我了解,Django 正在寻找一个正常的整数值。因此,当我尝试删除或修改内容时,它会给我一个错误:Field 'id' expected a number but got 'None'.
我应该为每个模型创建自己的“id”字段吗?应该/可以使用默认的_id
字段吗?
谢谢!
【问题讨论】:
id
和 _id
字段不一样。也许您需要在创建记录时添加 id 字段?
【参考方案1】:
在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 充当主键的字段。
The _id field docs.
“_id”字段始终在 mongo 集合中。如果您没有像这样在模型中明确提供“_id”字段:
_id = djongo_models.ObjectIdField()
那么您无法从 djongo 查询它。 如果您没有提供任何标记为 primary_key 的字段,那么 djongo 会帮助您并为您提供
id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
您可以在迁移文件中检查它。 Djongo 还为该字段创建了唯一索引。所以你最终会得到两个唯一索引,一个是“_id”,它是 bson ObjectId,第二个是“id”,它将是一个序列整数。 如果您在幕后添加了自动字段“id”或 djongo,您应该能够按“id”过滤,例如:
YourModel.objects.filter(id=1).delete()
所以你不需要添加“id”字段,djongo 会为你做的。 并且“_id”字段将始终在 mongo 集合中,您可以忽略它或将其添加到模型中,然后使用它(查询)。
【讨论】:
以上是关于将 _id 从 ObjectId 更改为正常的唯一自动增量整数的主要内容,如果未能解决你的问题,请参考以下文章
使用 java 在 Micronaut 中将 MongoDb ObjectId _id 更改为字符串