[pyar] Herencia en SQLAlchemy

Ariel Rossanigo arielrossanigo en gmail.com
Mie Jul 30 08:56:20 ART 2014


Hola Tomas,  en el escenario que planteas estarias cambiando la clase de
una instancia; lo cual en principio no es muy OOP que digamos.
Si bien no es lo que preguntas, tal vez te pueda servir el patron role [0].
Básicamente sirve para casos como este, una persona es un objeto por si
mismo y en algún momento cumple determinado rol, en tu caso pasa a ser un
usuario; lo cual implica la generación de ese nuevo rol. En términos de
modelado, el usuario no hereda de persona sino que tiene una Fk con
persona.

Espero que sirva,
Saludos

Ariel
[0]: http://en.wikipedia.org/wiki/Role_Class_Model


El 30 de julio de 2014, 8:16, Tomas Zulberti<tzulberti en gmail.com> escribió:

> Hola.
>
> Por ahi se entendio mal la pregunta.
>
> Simpre que hago:
>
> >>> usuario = Usuario(...)
> >>> db.session.add(usuario)
> >>> db.session.commt()
>
> Esto crea tambien un valor en la tabla de persona.
>
> Ahora el problema que yo tengo es que el valor en la tabla de persona
> ya esta creado, y quiero crear solo los valores en la tabla de
> Usuario.
>
> # Hace mucho tiempo
> >>> persona = Persona(...)
> >>> db.session.add(persona)
> >>> db.session.commit()
>
> # Ahora quiero crear los valores en la tabla de Usuario para esa persona
> >>> usuario = "NO SE COMO HACERLO..."
> >>> db.session.add(usuario)
> >>> db.session.commt()
>
> Muchas gracias,
> TZ
>
> 2014-07-29 14:41 GMT-03:00 Mariano Mara <mariano.mara en gmail.com>:
> >
> > 2014-07-29 14:32 GMT-03:00 Tomas Zulberti <tzulberti en gmail.com>:
> >
> >> Hola.
> >>
> >> Tengo dos modelos en SQLAlchemy:
> >>
> >> - Persona
> >> - Usuario
> >>
> >> Donde quiero que Usuario extienda de Persona. El tema es que a
> >> diferencia de los ejemplos de SQLAlchemy, la clase base Persona tiene
> >> sentido sola. Es decir, existe un registro de varias personas, y para
> >> alguna de ellas se crea el registro de Usuario.
> >>
> >> Los modelos son algo asi:
> >>
> >> class Persona(db.Model):
> >>      __mapper_args__ = {'polymorphic_on': 'person_type'}
> >>      id = db.Column(db.Integer, nullable=False, primary_key=True)
> >>      email = db.Column(db.String(1024), nullable=False)
> >>      person_type = db.Column(db.String(20), nullable=False)
> >>
> >>
> >>
> >> class Usuario(Persona):
> >>      __mapper_args__ = {'polymorphic_identity': 'usuario'}
> >>      id = db.Column(db.Integer, db.ForeignKey('persona.id'),
> >> primary_key=True, nullable=False)
> >>      password = db.Column(db.String(1024), nullable=False)
> >>
> >>
> >> El problema es que quiero poder hacer algo como esto y no encuentro la
> >> forma:
> >>
> >> >>> p = Person(email='pepe en gmail.com')
> >> >>> db.session.add(p)
> >> >>> db.session.commit()
> >> >>> print p.id
> >> 3
> >> >>> u = Usuario(id=3, password='UN HASH')
> >> >>> db.session.add(u)
> >> >>> db.session.commit()
> >> (IntegrityError) null value in column "email" violates not-null
> constraint
> >> 'INSERT INTO persona (id, name,
> >>
> >> Es decir, esta intentando de insertar una persona cuando yo lo unico
> >> que quiero que cree es el valor de una persona
> >>
> >>
> > No uses Single Table inheritance, usá una joined table y pone los
> atributos
> > que sean excluyentes de cada clase en su table particular (por ejemplo el
> > mail que es excluyente para Personas y no para usuarios). De otra forma
> el
> > nullable del email te lo va a exigir siempre porque es una constraint a
> > nivel de modelo de datos.
> >
> >
> > _______________________________________________
> > pyar mailing list pyar en python.org.ar
> > http://listas.python.org.ar/listinfo/pyar
> >
> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> >
> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> > Argentina - http://www.usla.org.ar
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140730/8fe74dba/attachment-0001.html>


More information about the pyar mailing list