如何在Django+Mongo项目中手动定义模型ID字段?
在Django(djongo)中为MongoDB手动定义模型ID字段
要实现通过Django admin面板正常编辑、删除MongoDB中的数据,需手动映射MongoDB的主键字段到Django模型,具体操作如下:
1. 修改模型的ID字段定义
使用djongo提供的ObjectIdField对应MongoDB默认的_id主键,修改后的模型代码如下:
from djongo import models from bson import ObjectId class Category2(models.Model): # 手动定义ID字段,映射MongoDB的_id id = models.ObjectIdField(primary_key=True, default=ObjectId, editable=False) name = models.CharField(max_length=200) slug = models.SlugField(max_length=200, unique=True) price = models.PositiveIntegerField() class Meta: ordering = ('name',) def __str__(self): return self.name
参数说明:
primary_key=True:将该字段设为模型主键,与MongoDB的_id对应default=ObjectId:让MongoDB自动生成标准的ObjectId值,无需手动传入editable=False:禁止在Django admin中编辑该字段,避免破坏MongoDB的数据结构
2. 同步模型到数据库
运行以下命令完成模型变更的迁移:
python manage.py makemigrations python manage.py migrate
3. 注册模型到Admin面板
在项目的admin.py中注册模型,才能在后台进行管理操作:
from django.contrib import admin from .models import Category2 admin.site.register(Category2)
可选:手动指定ID值
如果需要自行控制ID生成逻辑,可移除default=ObjectId参数,但创建对象时必须显式传入符合ObjectId格式的id值,示例:
from bson import ObjectId # 手动传入自定义ID category = Category2(id=ObjectId(), name="示例分类", slug="sample-category", price=200) category.save()
内容的提问来源于stack exchange,提问作者Hossein A.J
相关产品推荐
相关产品推荐

