2014-12-12 2 views
0

나는 몽고인 모델을 가지고 있는데, 그 모델의 일부 필드를 다른 기본값으로 참조하려고합니다. 이론적으로는 다음과 같이 보일 수 있습니다 :필드를 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 

현재 몽고 엔진에는 어떤 방법으로 가능합니까?

추 신 : 그렇습니다. 그런 스키마가 비정규 화를 일으킨다는 것을 알고 있습니다.

답변

1

필드의 기본값에서 "self"를 참조 할 수 없다고 생각합니다. 가능하다면 문서가 아니라 Field 인스턴스가 될 것입니다.

사용자가 정의한 동작을 사용하려면 좋은 이전 속성과 보호 된 필드를 정의해야합니다.

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 
관련 문제