Пилоны + SQLA: отношения один к одному - PullRequest
1 голос
/ 15 ноября 2010

Вопрос новичка. Пилоны 1 + SQLA с использованием декларативного стиля. Новое в Python.

У меня есть «основной» класс, называемый Entity, которому должны принадлежать «дочерние» классы, чтобы они были действительными. Моя ссылка на мастер-класс находится на уровне дочернего объекта. Моя проблема в том, что я не могу понять, как создать дочерний объект и создать главный объект, а также создать связь между объектами. Я использую отношения для связи.

Таким образом, я хотел бы создать ono для одной ссылки, как показано ниже: Сущность 1 - Клиент 1 Сущность 2 - Клиент 2 Сущность 3 - Продюсер 1 Сущность 4 - Продюсер 2 и т.д.

Код может объяснить лучше.

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__

В контроллере я пытаюсь создать нового клиента и добавить к нему сущность, которая с треском проваливается. Пожалуйста, введите код ниже.

            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()

Теперь, по моему мнению, это должно быть возможно, и я надеюсь, что кто-то может помочь, поскольку я в моем уме.

1 Ответ

0 голосов
/ 19 ноября 2010

Имеет ли это смысл?

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")

Я думаю, что "uselist = False" полезно, если вы используете OneToOne.

...