Есть ли способ найти родительский объект в couchdbkit? - PullRequest
1 голос
/ 28 ноября 2010

Я много сталкивался с этим в 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()

Сейчас я обошел вокруг родительского объекта, но мне не нравится этот подход.

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Иногда я пишу метод 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 s с момента последнего звонка get_children.

1 голос
/ 28 ноября 2010

Я только что поболтал с автором couchdbkit и, видимо, то, что я пытаюсь сделать, сейчас не поддерживается.

...