Python Flask MongoDB默认列

问题描述

我使用MongoEngine作为ORM,在MongoDB数据库上连接了一个小的Flask API。

我的一个文档是这样的:

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)

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

如果我使用 default = datetime.utcNow()

更改 create_date 字段,则相同。

那是为什么?

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

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

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...