Pylônes + SQLA: One to One relation
-
10-10-2019 - |
Question
Newbie question. Pylons 1 + SQLA en utilisant le style déclaratif. Nouveau sur Python.
J'ai une classe « maître » appelée entité qui classe « enfant » doivent appartenir à leur soient valides. Mon lien vers la classe principale est au niveau de l'objet enfant. Mon problème est que je ne peux pas à comprendre comment on crée un objet enfant et créer un objet maître ainsi que de créer le lien entre les objets. Je utilise des relations pour la liaison.
Ainsi je voudrais créer un ono sur un lien ci-dessous: Entité 1 - Client 1 Entité 2 - Client 2 Entité 3 - Producteur 1 Entité 4 - Producteur 2 etc.
Le code pourrait expliquer mieux.
class Entity(Base):
__tablename__ = "entities"
# Primary Key
entity_id = Column(Integer, primary_key=True)
# Data Fields
name = Column(Unicode(255), nullable=False)
def __init__(self, name, description):
self.name = name
def __unicode__(self):
return self.name
__str__ = __unicode__
class Client(Base):
__tablename__ = "clients"
client_id = Column(Integer, primary_key=True)
# Data fields
name = Column(UnicodeText(255), nullable=False, unique=True)
# Entity Link
entity_id = Column(Integer, ForeignKey('entities.entity_id'))
# Mapper
entity = relation('Entity')
def __init__(self, name):
self.name = name
def __unicode__(self):
return self.name
__str__ = __unicode__
Dans le contrôleur je tente de créer un nouveau client et l'ajouter une entité, qui échoue lamentablement. S'il vous plaît le code ci-dessous.
client_entity = model.Entity(name=client_name, description=client_name + " added")
client = model.Client(name=client_name)
client.entity.append(client_entity)
Session.add(client)
Session.commit()
Or, selon moi, cela devrait être possible et j'espère que quelqu'un peut aider comme je suis à mon esprit fin.
La solution
Est-ce que ce sens?
class Entity(Base):
__tablename__ = "entities"
# Primary Key
entity_id = Column(Integer, primary_key=True)
# Data Fields
name = Column(Unicode(255), nullable=False)
def __init__(self, name, description):
self.name = name
def __unicode__(self):
return self.name
__str__ = __unicode__
class Client(Base):
__tablename__ = "clients"
client_id = Column(Integer, primary_key=True)
name = Column(UnicodeText())
entity_id = Column(Integer, ForeignKey('entities.entity_id'))
# Mapper
entity = relation('Entity', uselist=False, backref='clients')
def __init__(self, name):
self.name = name
def __unicode__(self):
return self.name
__str__ = __unicode__
client_name="ClientName"
entitiy_name="EntityName"
client = Client(name=client_name)
client.entity=Entity(name=entitiy_name, description=entitiy_name + " added")
Je pense que "uselist = False" est utile si vous utilisez OneToOne.