将字段默认引用到mongoengine中的另一个字段

时间:2014-12-12 11:10:11

标签: python mongodb mongoengine

我有mongoengine模型,我想引用该模型的某些字段作为另一个默认值。从理论上讲,它可能看起来像这样:

class User(Document):
    first_name = StringField(default=lambda: self.full_name['first'])
    full_name = DictField()

对于保存文档,我可以更改.save()方法,但我希望它也能用于检索。即:

User(full_name{'first': 'John', 'last': 'Doe').save()
u = User.objects().first().first_name()
>>> John

目前的mongoengine有可能以某种方式吗?

PS:是的,我知道这样的架构会导致非规范化。

1 个答案:

答案 0 :(得分:1)

我认为你不能在字段的默认值中引用“self”,如果可以的话,它可能是Field实例,而不是你的Document。

要获得您定义的行为,我将定义一个好的旧属性和一个受保护的字段。

class User(Document):
    _first_name = StringField()
    full_name = DictField(required=True)

    @property
    def first_name(self):
        return self._first_name or self.full_name.get('first')

    @first_name.setter
    def first_name(self, value):
       self._first_name = value

通过这种方式,您可以:

user = User()
user.first_name
>>> None
user.full_name = {'first': 'John', 'last': 'Doe'}
>>> John
user.save()
user = User.objects().first()
user.first_name
>>> John
user.first_name = 'Jake'
user.first_name
>>> Jake
user.full_name.get('first')
>>> John