FastAPI中init_beanie无法正确初始化部分MongoDB集合的问题求助
核心成因
自定义模型未加入
init_beanie的初始化列表
Beanie只会初始化你在init_beanie函数的document_models参数中明确指定的Document类。如果只传了FastAPI-Users的User类,没把ProductCategory、ProductSubcategory加进去,这些自定义模型的集合自然不会被初始化,甚至会默认用类名(比如ProductCategory)作为集合名,忽略你在Settings里指定的name。模块未被正确加载
如果自定义模型所在的模块没被导入到初始化代码所在的文件中,Python解释器不会加载这些类,Beanie也就无法识别它们。比如启动文件里只导入了User,没导入ProductCategory和ProductSubcategory,即使你在document_models里写了类名,也会不生效。
解决步骤
1. 确保所有自定义模型都加入init_beanie的初始化列表
修改FastAPI启动时的init_beanie调用,把所有需要初始化的Document类都放进document_models里:
from fastapi import FastAPI from beanie import init_beanie from motor.motor_asyncio import AsyncIOMotorClient from fastapi_users_db_beanie import BeanieUserDatabase from your_app.models.user import User # FastAPI-Users的User类 from your_app.models.product_category import ProductCategory from your_app.models.product_subcategory import ProductSubcategory app = FastAPI() @app.on_event("startup") async def startup_db(): client = AsyncIOMotorClient("mongodb://localhost:27017") await init_beanie( database=client.your_db_name, document_models=[User, ProductCategory, ProductSubcategory] # 包含所有自定义模型 )
2. 统一管理模型导入(可选但推荐)
在项目里创建models/__init__.py文件,统一导出所有Document类:
# models/__init__.py from .user import User from .product_category import ProductCategory from .product_subcategory import ProductSubcategory __all__ = ["User", "ProductCategory", "ProductSubcategory"]
然后在启动文件里直接导入统一管理的模型:
from your_app.models import * await init_beanie( database=client.your_db_name, document_models=[User, ProductCategory, ProductSubcategory] )
3. 排查循环导入问题
如果ProductSubcategory和ProductCategory存在双向导入,会导致类加载失败。确保导入是单向的,或者在函数内部做延迟导入(比如在启动函数里导入模型),避免加载顺序问题。
完成以上修改后,Beanie会正确读取每个模型的Settings配置,创建你指定名称的集合,同时初始化所有自定义模型对应的集合。
内容的提问来源于stack exchange,提问作者Jorge Olmedo

