weranda
@weranda

Как правильно создать и добавлять данные в промежуточную таблицу?

Имеется три модели:

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))   


class Role(Base):
    __tablename__ = "roles"
    id = Column(Integer, primary_key=True, autoincrement=True)
    role = Column(String(50))


class UserRole(Base):
    __tablename__ = "users_roles"
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
    role_id = Column(Integer, ForeignKey("roles.id"), primary_key=True)


У одного пользователя может быть много ролей. Для этого и создал промежуточную таблицу. Не пойму как сформировать корректно модели и запросы так, чтобы:

1. При добавлении пользователя можно было бы назначать ему роль из существующих и добавлять пользователя в таблицу пользователей, а связку пользователь + роль в таблицу users_role.

2. Существующему пользователю можно было бы добавлять или убирать роли из существующих в таблице roles.

Подскажите, пожалуйста, решение.
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
У UserRole должен быть не обычный ключ - автоинкремент, а составной ключ user_id:role_id.
Тогда БД гарантирует, что в таблице UserRole будет не более одной записи для одной пары юзер-роль.
Создание такой записи будет означать, что у юзера есть роль, удаление - что у юзера роли нет.
Тогда и запросы будут тривиальными: для выдачи роли INSERT OR IGNORE, для снятия роли - DELETE FROM.

Единственно что, сначала добавляй пользователя и роль (если её нет), потом уже отношение.

Вообще я посоветую почитать документацию на отношения вида Many-To-Many.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы