Как указать ассоциативное отношение, используя декларативную базу - PullRequest
0 голосов
/ 22 декабря 2009

Я пытался создать связь между двумя таблицами, intake и module. Каждое потребление имеет отношение один-ко-многим с модулями. Однако каждому модулю назначена курсовая работа, и каждая курсовая работа имеет duedate, которая уникальна для каждого приема.

Я пробовал это, но это не сработало:

intake_modules_table = Table('tg_intakemodules',metadata,
   Column('intake_id',Integer,ForeignKey('tg_intake.intake_id',
                onupdate="CASCADE",ondelete="CASCADE")),
   Column('module_id',Integer,ForeignKey('tg_module.module_id',
                onupdate ="CASCADE",ondelete="CASCADE")),
   Column('dueddate', Unicode(16))
)

class Intake(DeclarativeBase):

    __tablename__ = 'tg_intake'

    #{ Columns
    intake_id = Column(Integer, autoincrement=True, primary_key=True)
    code = Column(Unicode(16))
    commencement = Column(DateTime)
    completion = Column(DateTime)

    #{ Special methods
    def __repr__(self):
        return '"%s"' %self.code
    def __unicode__(self):
        return self.code
    #}


class Module(DeclarativeBase):

    __tablename__ ='tg_module'

    #{ Columns
    module_id = Column(Integer, autoincrement=True, primary_key=True)
    code = Column(Unicode(16))
    title = Column(Unicode(30))

    #{ relations
    intakes = relation('Intake', 
        secondary=intake_modules_table, backref='modules')

    #{ Special methods
    def __repr__(self):
        return '"%s"'%self.title
    def __unicode__(self):
        return '"%s"'%self.title
    #}

Когда я делаю это, столбец duedate, указанный в intake_module_table, не создается. Пожалуйста, некоторая помощь будет оценена здесь.

заранее спасибо

1 Ответ

0 голосов
/ 22 декабря 2009

Фактически столбец duedate создан , но вы не получите его как атрибут модели при запросе ваших моделей. Вам нужно определить промежуточную модель для intake_modules_table таблицы и установить отношение к ней вместо Intake. Конечно, доступ к столбцам отношения будет немного длиннее (module.infakes[0].duedate, module.infakes[0].infake.code). Также вы можете настроить прокси-сервер ассоциации для доступа к списку Infake объектов так же, как сейчас.

...