问题描述
我在Flask API上使用Mongonegine,并且我有一个带有audit的表(带有create_date和update_date的2列)。
当前模型如下:
class ProductModel(db.Document):
Meta = {'collection': 'product','queryset_class': CustomQuerySet}
id = db.SequenceField(primary_key=True)
url = db.StringField(required=True,unique=True)
name = db.StringField(required=True,default=generate_random_string())
user_id = db.ReferenceField(usermodel,required=True)
create_date = db.DateTimeField()
update_date = db.DateTimeField()
vendor_id = db.ReferenceField(vendorModel,required=True)
active = db.IntField(required=True,default=1)
subscribed_list= db.EmbeddedDocumentListField(SubscribedListDocument)
price_history = db.EmbeddedDocumentListField(PriceHistoryDocument)
def to_json(self):
data = self.to_mongo()
data["vendor_id"] = {"name" :self.vendor_id.name,"active": self.vendor_id.active}
data["user_id"] = {"name": self.user_id.name}
return json_util.dumps(data)
def save(self,*args,**kwargs):
if not self.create_date:
self.create_date = get_current_date()
self.update_date = get_current_date()
return super(ProductModel,self).save(*args,**kwargs)
我通过“ 保存”方法实现了审计部分。
我计划也对另一个表实施审核,并且我想通过另一个继承的类来实现这一点,因此我不会在每个模型中都复制save方法:
class AuditModel(Document):
Meta = {'allow_inheritance': True}
create_date = DateTimeField(default=get_current_date)
update_date = DateTimeField(default=get_current_date)
# def save(self,**kwargs):
# if not self.create_date:
# self.create_date = get_current_date()
# self.update_date = get_current_date()
# print(self.create_date)
# return super(self).save(*args,**kwargs)
class ProductModel(db.Document,AuditModel):
......
但是它不起作用。
有什么想法吗?
谢谢。
解决方法
我为此解决了:
https://github.com/MongoEngine/mongoengine/issues/574
现在代码如下:
class AuditModel(Document):
meta = {'allow_inheritance': True,'abstract': True}
create_date = DateTimeField(default=get_current_date)
update_date = DateTimeField(default=get_current_date)
def save(self,*args,**kwargs):
if not self.create_date:
self.create_date = get_current_date()
self.update_date = get_current_date()
return super(AuditModel,self).save(*args,**kwargs)
class ProductModel(AuditModel):
meta = {'collection': 'product','queryset_class': CustomQuerySet}
id = db.SequenceField(primary_key=True)
url = db.StringField(required=True,unique=True)
name = db.StringField(required=True,default=generate_random_string())
user_id = db.ReferenceField(UserModel,required=True)
create_date = db.DateTimeField()
update_date = db.DateTimeField()
vendor_id = db.ReferenceField(VendorModel,required=True)
active = db.IntField(required=True,default=1)
subscribed_list= db.EmbeddedDocumentListField(SubscribedListDocument)
price_history = db.EmbeddedDocumentListField(PriceHistoryDocument)
def to_json(self):
data = self.to_mongo()
data["vendor_id"] = {"name" :self.vendor_id.name,"active": self.vendor_id.active}
data["user_id"] = {"name": self.user_id.name}
return json_util.dumps(data)
我需要在子类上添加{'abstract':True}。