我正在尝试定义一个 Document 类,其中包含一些字段,这些字段的值会在创建新文档时自动计算。
到目前为止,我已经通过像这样扩展 __init__
函数成功地做到了这一点:
class URLDoc(Document):
url = fields.URLField(requierd=True)
domain = fields.StringField(required=True)
screenshot = fields.ImageField(required=True, size=(600, 600, True), thumbnail=(100, 100, True))
def __init__(self, *args, **kwargs):
super(URLDoc, self).__init__(*args, **kwargs)
self.domain = urlparse(self.url).netloc
self.get_and_save_screenshot()
def get_and_save_screenshot(self):
'''Some code to get a screenshot of the website on self.url'''
self.screenshot.put(screenshot_file)
self.save()
这样我就可以通过调用 new_urldoc = URLDoc(url="some url")
然后 new_urldoc.save()
在 mongo 中创建新文档.
当我开始通过 URLDoc.objects.get(id="some id")
从 mongo 加载现有文档时,我意识到 __init__
函数将再次触发设置文档中的新数据(以新屏幕截图为例)。
我想实现这个但是只有当文档是新的时候,我到处都找不到答案..
有没有办法在初始化新文档时调用某些函数,而不是初始化现有文档?
最佳答案
我一直在寻找类似的解决方案,一段时间后我发现 MongoEngine 支持 Signals .在某些操作之前/之后,有多个信号可以与文档耦合:
- 初始化
- 节省
- 删除
不幸的是,它不支持基于文档更新的信号,但一个解决方法是检查发送者文档是否有 id。一个简单的片段代码 - 基于 MongoEngine 文档中的示例:
def update_modified(sender, document):
if document.id:
document.modified = datetime.utcnow() # Will only be executed if the document has been already saved
关于python - 初始化一个新的mongoengine文档时调用某些函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53403118/