Inserción de nuevos registros con relación uno a varios en sqlalchemy

Estoy siguiendo el tutorial de flask-sqlalchemy sobre la statement de modelos con respecto a la relación uno a varios. El código de ejemplo es el siguiente:

class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) addresses = db.relationship('Address', backref='person', lazy='dynamic') class Address(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(50)) person_id = db.Column(db.Integer, db.ForeignKey('person.id')) 

Ahora me pregunto cómo insertar nuevos registros en DB usando dicho modelo. Supongo que necesito un constructor init , pero tengo dificultades para entender cómo se debe implementar y usar. El principal problema para mí aquí es que la Persona depende de la Dirección y la Dirección tiene ForeignKey to Person, por lo que debe saber de antemano acerca de la Persona.

Por favor ayúdame a entender cómo se debe realizar.

Gracias de antemano.

No necesita escribir un constructor, puede tratar la propiedad de addresses en una instancia de Person como una lista:

 a = Address(email='foo@bar.com') p = Person(name='foo') p.addresses.append(a) 

O puede pasar una lista de direcciones al constructor de Person

 a = Address(email='foo@bar.com') p = Person(name='foo', addresses=[a]) 

En cualquier caso, puede acceder a las direcciones en su instancia de Person manera:

 db.session.add(p) db.session.add(a) db.session.commit() print p.addresses.count() # 1 print p.addresses[0] # 
print p.addresses.filter_by(email='foo@bar.com').count() # 1

En algunos casos, hay una excepción como “el objeto de lista no tiene atributo _sa_instance_state”.

 a = Address(email='foo@bar.com') p = Person(name='foo', addresses=a) 

Resuelve esta excepción.

Lo más importante al analizar este modelo es comprender el hecho de que este modelo tiene una relación de uno a muchos, es decir, una Persona tiene más de una dirección y las almacenaremos en una lista en nuestro caso.

Por lo tanto, la clase de persona con su inicial será algo así.

 class Person(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) addresses = db.relationship('Address', backref='person', lazy='dynamic') def __init__(self,id,name,addresses = []): self.id = id self.name = name self.addresses = addresses 

Por lo tanto, esta clase de persona estará esperando un ID, un nombre y una lista que contenga objetos de tipo Dirección. He mantenido que el valor predeterminado es una lista vacía.

Espero eso ayude. 🙂