python - 初始化一个新的mongoengine文档时调用某些函数

标签 python mongoengine

我正在尝试定义一个 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/

相关文章:

python - vim 中的 python 类成员没有 omnicompletion?

Python 将 ctypes 与链接到非标准共享库的共享库一起使用

python - 如何在mongoengine stringfield中返回选择值

django - 在settings.py中的mongoengine connect()测试问题

mongodb - 如何在 MongoEngine 中自动更新更新时间?

python - 如何一次在 mongodb 中创建 100000 个条目?

python - 为什么 datetime.strptime 在这个简单的例子中不起作用?

python - Scipy 相当于 numpy where 对于稀疏矩阵

python - 提高 float 的准确性

python - 如何使用 python 在 mongodb 中查询不同的结果?