首页 > 解决方案 > 如何访问 djongo 模型上的 _id 字段,它返回无

问题描述

此代码创建一个用户文档类 UserManager(BaseUserManager):

def create_user(self, name, email, password, mobile_number, alias=None):
    user = self.model(email=self.normalize_email(email))
    user.name = name
    user.mobile_number = mobile_number
    user.set_password(password)
    user.save()
    return user

def create_superuser(self, email, password):
    user = self.create_user(email, password)
    user.is_staff()
    user.is_superuser = True
    user.save()
    return user

这是它使用djongo模型类的用户模型

class User(AbstractBaseUser):
_id: ObjectIdField(primary_key=True)
email = EmailField(null=False, unique=True)
name = CharField(max_length=30)
mobile_number = CharField(max_length=10, unique=True)
is_active = BooleanField(default=True)
is_staff = BooleanField(default=False)

objects = UserManager()
USERNAME_FIELD = "email"

class Meta:
    db_table = "login"

user = User()
user.email = 'test@mail.com
user.name = 'name'
user_mobile_number = '7894561236'
user.save()

print(user._id) -> None 以这种方式访问​​用户 id 返回 None

user.name = 'newname'
user.save() #this creates a new instance of document

标签: djangodjongo

解决方案


您没有隐式创建 _id。_id 字段的创建通常由 MongoDB 服务器(文档)提供。因此,使用您的代码,您只能检索插入的对象并获取它的 _id 值。

User.objects.filter(email = 'test@mail.com').first()._id

如果您想在插入之前获得 _id 值,那么您需要使用 bson.objectid.ObjectId 类来创建它。您可以创建新的唯一标识符或创建自定义标识符。但请记住,ObjectId oid 参数只能是一个 ObjectId,也可以是任意 12 个字节。 在 pymongo 中使用 ObjectIds 的工具

from bson.objectid import ObjectId
user._id = ObjectId(b'123456789012') # or ObjectId() 

推荐阅读