问题描述
我使用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 字段,则相同。那是为什么?
create_date=db.DateTimeField(required=True,default=get_current_date)
解决方法
在python中,“在导入时”运行的代码与在“运行时”(所有导入完成之后)运行的代码之间是有区别的。
您对default=get_current_date()
的使用在导入时(即程序启动时)运行。因此,在运行时,它总是使用导入时(服务器程序启动的时间)已经确定的值。
您可能想要的是使用get_current_date
作为可调用对象。为此,请使用default=get_current_date
(不带括号)。这样,在运行时,每次需要默认值时都会调用该函数,然后它将首先执行您真正想要的操作。