sqlalchemy проверяет, находится ли объект в модели

Я хотел бы иметь возможность добавить приглашенного на такое событие:

e = events.get(1)
u = users.get(1)
e.invitees.append(u)

а затем на моем сервисном уровне я хотел бы иметь такую ​​​​функцию, как:

def add_invitee(self, event, user):
    if user in self.get(event).invitees:
        raise OroposError(u'User already invited')
    event.invitees.append(user)
    return self.save(event), user

Когда я попробовал это, произошло несколько вещей. Когда я попытался использовать свою функцию, я получаю эту ошибку:

InterfaceError: (InterfaceError) Ошибка привязки параметра 0 — вероятно, неподдерживаемый тип. u'SELECT events.id КАК events_id, events.user_id КАК events_user_id, events.event_name КАК events_event_name, events.event_mesg КАК Events_event_mesg, events.start_date КАК Events_start_date, events.end_date КАК Events_end_date, events.event_status КАК Events_event_status, events.rsvp КАК events_rsvp , events.created AS events_created \nИЗ событий \nГДЕ events.id = ?' (,)

и когда я пытаюсь использовать e.invitees.append(u), я получаю эту ошибку:

  File "/Users/f/.virtualenvs/Oropos/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1057, in append
    item = __set(self, item, _sa_initiator)
  File "/Users/f/.virtualenvs/Oropos/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 1029, in __set
    item = getattr(executor, 'fire_append_event')(item, _sa_initiator)
  File "/Users/f/.virtualenvs/Oropos/lib/python2.7/site-packages/sqlalchemy/orm/collections.py", line 733, in fire_append_event
    item, initiator)
  File "/Users/f/.virtualenvs/Oropos/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 910, in fire_append_event
    value = fn(state, value, initiator or self)
  File "/Users/f/.virtualenvs/Oropos/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 1140, in emit_backref_from_collection_append_event
    child_impl = child_state.manager[key].impl
KeyError: 'event'

Это поставило меня в тупик на некоторое время. Какие-либо предложения?

Вот модели, связанные с моей проблемой.

class EventJsonSerializer(JsonSerializer):
    pass


class Event(EventJsonSerializer, db.Model):
    __tablename__ = 'events'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    event_name = db.Column(db.String(30))
    event_mesg = db.Column(db.Text)
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    event_status = db.Column(db.Boolean)
    rsvp = db.Column(db.Date)
    created = db.Column(db.DateTime, default=get_current_time)

    invitees = db.relationship('Invite', backref=db.backref('event'))
    proposals = db.relationship('Proposal', backref=db.backref('event'))


class InviteJsonSerializer(JsonSerializer):
    pass


class Invite(InviteJsonSerializer, db.Model):
    __tablename__ = 'invites'

    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.Date, default=get_current_time)
    user_id = db.Column(db.ForeignKey('users.id'))
    event_id = db.Column(db.ForeignKey('events.id'))

    user = db.relationship('User', foreign_keys='Invite.user_id', lazy='joined')


class ProposalJsonSerializer(JsonSerializer):
    pass


class Proposal(ProposalJsonSerializer, db.Model):
    __tablename__ = 'proposals'

    id = db.Column(db.Integer, primary_key=True)
    created = db.Column(db.Date, default=get_current_time)
    date = db.Column(db.Date)
    user_id = db.Column(db.ForeignKey('users.id'))
    event_id = db.Column(db.ForeignKey('events.id'))

person Ptrkcon    schedule 21.01.2014    source источник


Ответы (1)


Если я не ошибаюсь, вы пытаетесь добавить экземпляр User в список экземпляров Invite, вы уверены, что это правильно?

Согласно вашему коду, e.invitees содержит экземпляры Invite, у которых есть внешний ключ event_id, указывающий на экземпляр Event e. Если вы хотите, чтобы ваш invitees представлял отношение "многие ко многим" к таблице User (что подразумевается двумя внешними ключами), вам, вероятно, нужно превратить его в таблица связей. Кроме того, я бы осмелился предположить, что один User может иметь только один Invite для одного Event, что означает, что поля должны быть связаны с UniqueConstraint аргумент таблицы.

person Berislav Lopac    schedule 01.09.2017