Вы должны сделать это так, как вы описали. MongoDB является нереляционной базой данных и не поддерживает объединения.
В любом случае, как упомянуто @jasonharper, в какой-то момент вам нужно будет указать направление, к которому относится экземпляр Variable
, к какому экземпляру Model
, так что вы, скорее всего, получите что-то вроде этого:
varA = Variable(mdl, ...)
# or this
mdl.varA = Variable(...)
При первом способе вы сохранили бы метод в своем классе Variable
:
class Foo:
def __init__(self):
self.vars = []
class Bar:
def __init__(self, foo_instance, **kwargs):
foo_instance.vars.append(self)
f = Foo()
b = Bar(f, hello='hey')
f.vars
# [<__main__.Bar object at 0x03F6B4B0>]
Со вторым способом вы можете добавить Variable
экземпляров в list
каждый раз, когда он добавляется:
class Foo:
def __init__(self):
self.vars = []
def __setattr__(self, name, val):
self.__dict__.update({name: val})
if not name == 'vars': # to prevent a recursive loop
self.vars.append(val)
f = Foo()
f.vars
# []
f.a = 'bar'
f.vars
# ['bar']
Конечно, проще было бы просто смотреть прямо в __dict__
каждый раз, когда вы хотите vars
: [1115 ]
class Bar:
@property
def vars(self):
# Or you can return .items() if you want both the name and the value
return list(self.__dict__.values())
b = Bar()
b.a = 'hello'
b.vars
# ['hello']
Оба они будут работать одинаково, даже если вы присвоили атрибуты своим собственным экземплярам класса.
Вы можете использовать super () для этого и передать экземпляр родительскому элементу
class Model():
vars = []
def __init__(self, other=None):
if other:
self.vars.append(other)
class Variable(Model):
def __init__(self, a):
self.a = a
super().__init__(self)
mdl = Model()
varA = Variable(3)
varB = Variable(4)
print(mdl.vars)