【问题标题】:mongoengine default value from another field来自另一个字段的 mongoengine 默认值
【发布时间】:2014-07-25 13:48:16
【问题描述】:

我正在为一个项目试用 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 only accepts string values: ['full_name'])

:编辑:

我没有提到我的应用有一个服务层,它使我能够简单地这样做:

if company_data['short_name'] is None:
            myCompany.full_name = company_data['short_name']


        obj = myCompany.save()

而且效果很好。

【问题讨论】:

  • Mongoengine 有很多循环依赖的问题。这可能是可能的,但您最好在最后执行此默认设置。

标签: python mongoengine


【解决方案1】:

您可以在 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)

【讨论】:

  • 这是否会执行被覆盖的 save 方法的其余部分,例如验证和实际插入到集合中?
  • @ivica 是的,它是使用super() 处理的。不过,最好确保它适合你——我没有亲自测试过。
  • 我已经像你说的那样尝试过了,它确实插入到集合中,但返回 None,我无法获取插入文档的 _id。
  • @ivica 我的错,我错过了return 声明。再试一次。谢谢。
【解决方案2】:

看看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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2016-01-02
    • 2016-04-19
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多