我在couchdbkit中经常遇到这个问题 - 据我所知,在couchdbkit下的子对象Document对象没有引用回父对象。我希望我错了:
class Child(DocumentSchema):
name = StringProperty()
def parent(self):
# How do I get a reference to the parent object here?
if self.parent.something:
print 'yes'
else:
print 'no'
class Parent(Document):
something = BooleanProperty()
children = SchemaListProperty(Child)
doc = Parent.get('someid')
for c in doc.children:
c.parent()
现在我一直在做的是传递父对象,但我不喜欢这种方法。
答案 0 :(得分:1)
我刚刚和couchdbkit的作者聊过,显然我现在不支持我想做的事。
答案 1 :(得分:1)
我有时会在父级上编写get_child
或get_children
方法,在返回之前设置_parent
属性。即:
class Parent(Document):
something = BooleanProperty()
children = SchemaListProperty(Child)
def get_child(self, i):
"get a single child, with _parent set"
child = self.children[i]
child._parent = self
return child
def get_children(self):
"set _parent of all children to self and return children"
for child in self.children:
child._parent = self
return children
那么你可以写代码如下:
class Child(DocumentSchema):
name = StringProperty()
def parent(self):
if self._parent.something:
print 'yes'
else:
print 'no'
这与使用couchdbkit的缺点很明显:你必须为每个子文档编写这些访问器方法(或者如果你聪明地编写一个可以为你添加这些的函数),但更烦人的是你必须总是致电p.get_child(3)
或p.get_children()[3]
,并担心自上次致电_parent
以来您是否添加了get_children
个孩子。