Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 来自其他字段的mongoengine默认值_Python_Mongoengine - Fatal编程技术网

Python 来自其他字段的mongoengine默认值

Python 来自其他字段的mongoengine默认值,python,mongoengine,Python,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

我正在为一个项目试用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(公司:无)(StringField仅接受字符串值:['full\u name'])

:编辑:

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

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


        obj = myCompany.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)
看看:

可以通过将函数传递给字段的默认属性来实现这一点:

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

Mongoengine在循环依赖方面存在一系列问题。这可能是可能的,但您最好还是自己执行此默认设置。这会执行被重写的
save
方法的其余部分,如验证和实际插入到集合中吗?@ivica是的,它是通过使用
super()
来处理的。不过,最好确保它对您有效-我没有亲自测试过它。我像您说的那样尝试过,它确实插入到了集合中,但没有返回任何内容,而且我无法获取插入文档的_id。@ivica我的错,我缺少
return
语句。再试一次。谢谢