【问题标题】:Python Flask MongoDB default columnPython Flask MongoDB 默认列
【发布时间】:2020-09-21 07:58:33
【问题描述】:

我在 MongoDB 数据库上连接了一个小型 Flask API,使用 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)

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

如果我用 default=datetime.utcnow()

更改 create_date 字段也是如此

为什么会这样?

乐: 想办法: 默认值不应该调用函数,只需要一个引用

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

【问题讨论】:

    标签: python mongodb flask mongoengine


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 2021-03-26
      • 2017-06-20
      • 2021-05-17
      • 2014-11-17
      • 2022-01-01
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多