我有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:是的,我知道这样的架构会导致非规范化。
答案 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