Closed hd10180 closed 7 months ago
Hi @hd10180 ,
Thank you for the issue. Please use event Save
for this case. Save
and SaveChanges
are different and use different events.
import asyncio
from datetime import datetime
from beanie import (
Document,
Insert,
Replace,
SaveChanges,
Save,
after_event,
before_event,
init_beanie,
)
from motor.motor_asyncio import AsyncIOMotorClient
from pydantic import BaseModel, Field
class Users(Document):
name: str
enabled: bool = True
desc: str | None = None
created: datetime = Field(default_factory=datetime.utcnow)
# !附加检查
@before_event([Insert, Replace, SaveChanges, Save])
def checker_before(self):
print("before..............")
if not self.desc:
del self.desc
@after_event([Insert, Replace, SaveChanges, Save])
def checker(self):
print("after...............")
if not self.desc:
del self.desc
class Settings:
name = "users"
use_state_management = True
class UpdateUsers(BaseModel):
enabled: bool | None = None
desc: str | None = None
async def main():
import beanie
print(f"beanie version: {beanie.__version__}")
cli = AsyncIOMotorClient("mongodb://beanie:beanie@localhost:27017")
db = cli["test_wrong_collection"]
await db.drop_collection(Users.Settings.name)
await db[Users.Settings.name].insert_one(
{"name": "lucy", "enabled": True, "created": datetime.utcnow()}
)
print(await db[Users.Settings.name].find_one({"name": "lucy"}))
await init_beanie(db, document_models=[Users])
test_user = Users(name="hello")
await test_user.save()
print(await db[Users.Settings.name].find_one({"name": "hello"}))
asyncio.run(main())
Hi @hd10180 , Thank you for the issue. Please use event
Save
for this case.Save
andSaveChanges
are different and use different events.import asyncio from datetime import datetime from beanie import ( Document, Insert, Replace, SaveChanges, Save, after_event, before_event, init_beanie, ) from motor.motor_asyncio import AsyncIOMotorClient from pydantic import BaseModel, Field class Users(Document): name: str enabled: bool = True desc: str | None = None created: datetime = Field(default_factory=datetime.utcnow) # !附加检查 @before_event([Insert, Replace, SaveChanges, Save]) def checker_before(self): print("before..............") if not self.desc: del self.desc @after_event([Insert, Replace, SaveChanges, Save]) def checker(self): print("after...............") if not self.desc: del self.desc class Settings: name = "users" use_state_management = True class UpdateUsers(BaseModel): enabled: bool | None = None desc: str | None = None async def main(): import beanie print(f"beanie version: {beanie.__version__}") cli = AsyncIOMotorClient("mongodb://beanie:beanie@localhost:27017") db = cli["test_wrong_collection"] await db.drop_collection(Users.Settings.name) await db[Users.Settings.name].insert_one( {"name": "lucy", "enabled": True, "created": datetime.utcnow()} ) print(await db[Users.Settings.name].find_one({"name": "lucy"})) await init_beanie(db, document_models=[Users]) test_user = Users(name="hello") await test_user.save() print(await db[Users.Settings.name].find_one({"name": "hello"})) asyncio.run(main())
thanks. Sorry for taking up your time, it works fine
Describe the bug before_event, after_event can not trigger beanie version: 1.24.0 & 1.25.0 both have the same behavior
To Reproduce a completely code
output:
Expected behavior the record which name="hello" should not have desc=None attr, and it should call
checker_before
andchecker
function, but they didn't callAdditional context none