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

Mongoengine中Required=True验证规则不生效,缺失必填字段的文档仍可存入数据库

问题原因与解决方案

嗨,我一眼就看到你问题的症结啦——这是个大小写导致的小失误!

核心错误:参数名大小写错误

MongoEngine里控制字段必填的参数是小写的required,但你代码里写的是大写的Required=True。这个大写的参数会被MongoEngine当成自定义的额外属性,而不是生效的必填验证规则,所以即使缺失songName这类字段,文档依然能被存入数据库。

修正后的Song类代码

class Song(db.Document): 
    # 把 Required=True 改成 required=True
    Id = db.IntField(min_value=0, unique=True, required=True)
    songName = db.StringField(unique=True, max_length=100, required=True)
    
    def json(self):
        song_dict = { "Id": self.Id, "songName": self.songName }
        return json.dumps(song_dict)
    
    meta = { "indexes": ["Id"], "ordering": ["-date_created"] }

额外的代码优化建议

除了这个必填字段的问题,你的代码还有几个可以改进的地方:

  1. 避免使用eval(),存在安全风险
    直接用eval(audioFileType)非常危险,如果攻击者传入恶意的audioFileType值,可能会执行任意代码。建议用字典映射的方式来关联类型和对应的文档类:

    # 先定义类型映射字典
    audio_type_map = {
        "Song": Song
        # 以后添加其他类型(比如Podcast、Audiobook)也在这里加
    }
    
    # 然后在路由里替换eval的逻辑
    if _json['audioFileType'] in audio_type_map:
        audio_cls = audio_type_map[_json['audioFileType']]
        record = audio_cls(**_json['audioFileMetadata'])
        record.save()
        # ... 后续逻辑
    
  2. 增强请求数据验证
    除了依赖MongoEngine的字段验证,建议在接收请求时先做一层前置验证,比如检查audioFileMetadata里的必要键是否存在,避免因为数据格式问题触发不必要的异常。

Stack Overflow发帖格式小建议

你的帖子整体已经很清晰了,再提两个小细节会更完美:

  • 给代码块指定语言(比如python、json),这样代码会有语法高亮,可读性更强
  • 可以补充说明你使用的MongoEngine和Flask版本,有时候版本差异也会导致奇怪的问题

内容的提问来源于stack exchange,提问作者Yash viroja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:52:29