2011-09-03 16 views
9

Estoy aprendiendo a usar SQLAlchemy. Estoy tratando de hacer lo siguiente, pero el almacenamiento de título y enlace en dos mesas separadas:AttributeError: el objeto 'unicode' no tiene atributo '_sa_instance_state'

temp = Submissions(title=u'Facebook Homepage', link=u'http://facebook.com') 
session.add(temp) 
session.flush() 
transaction.commit() 

a través de:

class Links(Base): 
    __tablename__ = 'links' 
    id = Column(Integer, primary_key=True) 
    link = Column(Text) 
    created = Column(TIMESTAMP(), default=datetime.now()) 

    def __init__(self, link): 
     self.link = link 

class Submissions(Base): 
    __tablename__ = 'submissions' 
    id = Column(Integer, primary_key=True) 
    created = Column(TIMESTAMP(), default=datetime.now()) 
    title = Column(Text) 
    link_id = Column(Integer, ForeignKey('links.id')) 
    link = relation(Links) 

    def __init__(self, title, link): 
     self.title = title 
     self.link = link 

Sin embargo, siempre me sale este error:

AttributeError: 'unicode' object has no attribute '_sa_instance_state' 

Que esta pasando? ¿Hay una mejor manera de codificar esto?

Respuesta

9

No puede hacer eso con relationship.

Necesita organizar para que el Link se busque de alguna manera.

Lo más obvio es buscarlo directamente.

submission_link = session.query(Links) \ 
         .filter(Links.link == u'http://facebook.com') \ 
         .first() 
if submission_link is None: 
    submission_link = Links(link=u'http://facebook.com') 
    session.add(submission_link) 

submission = Submissions(title=u'Facebook Homepage', link=submission_link) 
session.add(submission) 
session.commit() 

También puede utilizar hybrid attributes para conseguir algo que se parece un poco más como su ejemplo, pero su mucho más complicado.

también, es relationship, relation está obsoleto.

+0

gracias, es exactamente lo que necesitaba. –

+1

¿no debería ser 'session.add (submission)'? –

2

Configuraría la relación como one-to-one() y agregaría una propiedad que incluiría la relación link. La configuración de SA se vería a continuación y su código debería funcionar perfectamente creando, actualizando y eliminando el enlace. Es posible que deba configurar la relación para tener la opción delete-orphan en un cascade.

... 
class Submissions(Base): 
    __tablename__ = 'submissions' 
    id = Column(Integer, primary_key=True) 
    created = Column(DateTime(), default=datetime.now()) 
    title = Column(Text) 
    link_id = Column(Integer, ForeignKey('links.id')) 
    link_rel = relation(Links, backref=backref("_submission", uselist=False)) 

    def __init__(self, title, link=None): 
     self.title = title 
     self.link = link 

    @property 
    def link(self): 
     return self.link_rel and self.link_rel.link 

    @link.setter 
    def link(self, value): 
     if value is None: 
      self.link_rel = None 
     elif self.link_rel is None: 
      self.link_rel = Links(value) 
     else: 
      self.link_rel.link = value 
... 
+0

no se puede votar, pero aquí hay un agradecimiento. desafortunadamente estoy separando enlaces porque la lista está en, no uno a uno. –

Cuestiones relacionadas