mongoengine 从另一个字段获取默认值

6 投票
3 回答
7458 浏览
提问于 2025-04-18 08:37

我正在尝试在一个项目中使用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)

撰写回答