Python Flask MongoDB 默认列

Python Flask MongoDB default column

我有一个小型 Flask API 连接到 MongoDB 数据库,使用 MongoEngine 作为 ORM。

我的一份文件是这样的:

class PriceHistoryDocument(db.EmbeddedDocument):
    create_date=db.DateTimeField(required=True, default=get_current_date())
    price=db.DecimalField(required=True, precision=4)
    error=db.StringField(required=True, default='')

class ProductModel(AuditModel):
    meta = {'collection': 'product', 'queryset_class': CustomQuerySet}
    id = db.SequenceField(primary_key=True)
    price_history = db.EmbeddedDocumentListField(PriceHistoryDocument)

get_current_date():

from datetime import datetime
def get_current_date():
    return datetime.utcnow()

以及来自控制器的保存产品部分:

    try:
        product = ProductModel.objects.get(url=url)
        # current_app.logger.info(f'Product url found {url}')
        product.price_history.append(current_price_detail)
        product.save()
        if response: # TODO: fix this to something clearer
            updated_url.append(url)
        else:
            failed_url.append(url)
    except Exception as e:
        # current_app.logger.info('Unable to save the product details {e}!')
        failed_url.append(url)

我的问题是,如果我启动服务器并多次调用控制器,每次产品都以相同的日期(服务器启动的日期)保存在数据库中。

如果我将 create_date 字段更改为 default=datetime.utcnow()

为什么会这样?

乐: 想办法: 默认值不应该调用函数,只需要一个参考[​​=16=]

create_date=db.DateTimeField(required=True, default=get_current_date)

在 python 中,“在导入时”运行的代码与在“运行时”运行的代码(在所有导入完成后)之间存在差异。

您对 default=get_current_date() 的使用在导入时运行,即程序启动时。所以在运行时,它总是使用在导入时已经确定的值,这是您的服务器程序启动的时间。

您可能想要的是将 get_current_date 用作可调用对象。为此,请使用不带括号的 default=get_current_date。这样在运行时,每次需要默认值时都会调用该函数,然后它会首先执行您真正想要的操作。