mongoengine 从另一个字段获取默认值
我正在尝试在一个项目中使用MongoEngine,感觉还不错。我想知道是否可以从一个字段设置另一个字段的默认值?类似于这样:
import mongoengine as me
class Company(me.Document):
short_name = me.StringField(required=True)
full_name = me.StringField(required=True, default=short_name)
这样做会出错,错误信息是 ValidationError (Company:None) (StringField 只接受字符串值: ['full_name'])
:编辑:
我没有提到我的应用程序有一个服务层,这让我可以简单地这样做:
if company_data['short_name'] is None:
myCompany.full_name = company_data['short_name']
obj = myCompany.save()
而且效果很好。
3 个回答
0
default
这个东西不会把文档的实例传递过去,所以你无法实现你想要的效果。
save
的方法可以用,但 full_name
的值在调用 save()
之前是不会被设置的。
相反,你可以使用 mongoengine 的 post_init
信号
@mongonegine.post_init.connect_via(Company)
def set_full_name(sender, document, **kwargs):
document.full_name = document.full_name or document.short_name
- 这个方法适用于新创建的实例和从查询中得到的文档。
- 默认值在初始化后就可以立即使用。
Company(short_name='hello').full_name' == 'hello'
4
请查看这个链接:http://docs.mongoengine.org/guide/defining-documents.html#field-arguments。
你可以通过给字段的默认属性传递一个函数来实现这个功能:
class ExampleFirst(Document):
# Default an empty list
values = ListField(IntField(), default=list)
class ExampleSecond(Document):
# Default a set of values
values = ListField(IntField(), default=lambda: [1,2,3])
class ExampleDangerous(Document):
# This can make an .append call to add values to the default (and all the following objects),
# instead to just an object
values = ListField(IntField(), default=[1,2,3])
11
你可以在一个 Document
上重写 save()
方法:
class Company(me.Document):
short_name = me.StringField(required=True)
full_name = me.StringField()
def save(self, *args, **kwargs):
if not self.full_name:
self.full_name = self.short_name
return super(Company, self).save(*args, **kwargs)