Ho quattro classi in questo modo: Group
, Parent
, Child
, Toy
.SQLAlchemy proxy dell'associazione concatenamento per pronipoti?
Group
ha un rapportoparents
indicandoParent
Parent
ha un rapportochildren
indicandoChild
Child
ha un rapportotoys
indicandoToy
Parent
ha un toys
association_proxy
che produce tutti lo Toy
s che i bambini di Parent
hanno.
Voglio essere in grado di ottenere tutti i giocattoli in un gruppo. Ho cercato di creare un association_proxy
su Group
che si collega a Parent
's toys
, ma produce questo:
[[<Toy 1>, <Toy 2>], [], [], []]
quando voglio questo:
[<Toy 1>, <Toy 2>]
Se il Parent
' s children
non hanno qualsiasi Toy
s, quindi il proxy dell'associazione toys
è []
. Tuttavia, il secondo proxy di associazione non è in grado di escludere gli elenchi vuoti. Inoltre, gli elenchi dovrebbero essere compressi. C'è comunque per farlo funzionare?
class Group(db.Model):
id = db.Column(db.Integer, primary_key=True)
created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
name = db.Column(db.String(80, convert_unicode=True))
# relationships
parents = db.relationship('Parent', backref='group')
toys = association_proxy('parents', 'toys')
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
group_id = db.Column(db.Integer, db.ForeignKey('group.id', ondelete='CASCADE'))
created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
first_name = db.Column(db.String(80, convert_unicode=True))
last_name = db.Column(db.String(80, convert_unicode=True))
children = db.relationship('Child', backref='parent', cascade='all, delete')
toys = association_proxy('children', 'toys')
class Child(db.Model):
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parent.id', ondelete='CASCADE'))
created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
class Toy(db.Model):
id = db.Column(db.Integer, primary_key=True)
child_id = db.Column(db.Integer, db.ForeignKey('child.id', ondelete='CASCADE'))
created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
child = db.relationship('Child', backref=db.backref("toys",cascade="all, delete-orphan", order_by="desc(Toy.id)"))
Questa navigazione da (grand-) non-genitore è solo per la visualizzazione o anche per la modifica delle raccolte sottostanti? – van
@van idealmente entrambi. –
OK, in tal caso, come pensi di aggiungere giocattoli al 'Gruppo'? se fai 'my_group.toys.append (my_new_toy)', a cui 'Parent' e' Child' sarà assegnato? – van