You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoEngine新手求助:如何从字段中获取字符串值?

如何从MongoEngine字段中获取字符串值

嘿,刚上手MongoEngine踩这个坑太正常了!我来给你拆解下问题所在,以及怎么正确拿到字段的字符串值:

为啥你现在的代码打印的是对象地址?

你写的打印代码是在类定义的阶段执行的——这时候MongoEngine的字段还只是类的属性,是Field对象本身,还没和具体的文档实例绑定,根本没有实际存储的字符串值,所以打印出来的自然是字段对象的内存地址啦。

正确的打开方式:在实例层面访问字段

要拿到实际的字符串值,必须等你创建了类的实例(也就是MongoDB里的文档)之后,再访问实例的属性。或者在类的实例方法里操作,因为实例方法里的self就是当前的文档实例。

给你改好的代码示例:

from mongoengine import Document, fields

# 先定义AbstractApplication,不然AccessToken的ReferenceField会找不到它
class AbstractApplication(Document): 
    client_id = fields.StringField(
        max_length=100, 
        unique=True, 
        default=generate_client_id, 
        db_index=True
    )

    # 写个实例方法来打印client_id
    def show_client_id(self):
        print(f"client_id: {self.client_id}")

class AccessToken(Document): 
    application = fields.ReferenceField(AbstractApplication) 
    extras = fields.StringField(blank=True) 

    # 实例方法里访问实例的字段
    def show_token_details(self):
        # 先确认application关联了实例,再访问client_id
        if self.application:
            print(f"application.client_id: {self.application.client_id}")
        print(f"extras: {self.extras}")

# --- 实际使用的时候这么做 ---
# 先创建并保存AbstractApplication实例(会自动生成client_id)
my_app = AbstractApplication()
my_app.save()

# 创建AccessToken实例,关联刚才的app,设置extras
my_token = AccessToken(application=my_app, extras="测试额外信息")
my_token.save()

# 调用实例方法打印值
my_app.show_client_id()
my_token.show_token_details()

# 也可以直接访问实例属性拿到字符串
print(f"直接获取client_id:{my_app.client_id}")
print(f"直接获取extras:{my_token.extras}")

额外提醒

  • 对于ReferenceField,要确保关联的文档实例已经保存到数据库(或者创建时就关联已存在的实例),不然直接访问self.application.client_id可能会报错。
  • 类定义阶段只能用来配置字段(比如设置default参数),不能用来获取实际的数据值——数据都是存在实例里的哦!

内容的提问来源于stack exchange,提问作者C.D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:57:34