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