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
。这样在运行时,每次需要默认值时都会调用该函数,然后它会首先执行您真正想要的操作。
我有一个小型 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
。这样在运行时,每次需要默认值时都会调用该函数,然后它会首先执行您真正想要的操作。