update tutorial queries one delete datatypes flask relationship foreign-key-relationship flask-sqlalchemy

flask - tutorial - model sqlalchemy



Insertar nuevos registros con una relaciĆ³n uno a muchos en matraz-sqlalchemy (3)

En algunos casos, existe una excepción como "objeto de lista no tiene atributo _sa_instance_state".

a = Address(email=''[email protected]'') p = Person(name=''foo'', addresses=a)

Resuelve esta excepción

Estoy siguiendo el tutorial frasco-sqlalchemy sobre la declaración de modelos con respecto a la relación de uno a muchos. 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 utilizando dicho modelo. Supongo que necesito un init de constructor, pero tengo dificultades para entender cómo se debe implementar y usar. El problema principal para mí aquí es que la persona depende de la dirección y la dirección tiene una clave externa para la persona, por lo que debe conocer a la persona por adelantado.

Plase me ayuda a entender cómo se debe realizar.

Gracias de antemano.


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

Entonces, la clase Person con su init se verá 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

Entonces, esta clase Person esperará una identificación, un nombre y una lista que contenga objetos del tipo Dirección. He mantenido que el valor predeterminado sea una lista vacía.

Espero eso ayude. :)


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

a = Address(email=''[email protected]'') p = Person(name=''foo'') p.addresses.append(a)

O puede pasar una lista de direcciones al constructor de Person

a = Address(email=''[email protected]'') 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] # <Address object at 0x10c098ed0> print p.addresses.filter_by(email=''[email protected]'').count() # 1