SQLAlchemy: эффективная загрузка отношений в трехстороннем отношении «многие ко многим»Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 SQLAlchemy: эффективная загрузка отношений в трехстороннем отношении «многие ко многим»

Сообщение Anonymous »

Я хочу создать простую базу данных управления пользователями с использованием async SQLALchemy 2.0 со следующей идеей:
  • Пользователь должен иметь только одна роль в одном проекте
  • Пользователь может иметь разные роли в разных проектах
  • Пользователь может быть частью несколько проектов (которые могут содержать тысячи документов)
Вот что у меня есть:

Код: Выделить всё

class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(60), index=True, unique=True)
user_project_roles = relationship('UserProjectRoleLink', back_populates='user')

class Project(db.Model):
__tablename__ = 'device'
id = db.Column(db.Integer, primary_key=True)
project_name = db.Column(db.String(60), unique=True)
user_project_roles = relationship('UserProjectRoleLink', back_populates='project')

documents = relationship('Document', back_populates='project') # thousands of documents

class Document(db.Model)
__tablename__ = 'device'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60), unique=True)
text =db.Column(db.String(60))
project = relationship('Project', back_populates="documents")

class Role(db.Model):
__tablename__ = "role"

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60), unique=True)
user_project_roles = relationship('UserProjectRoleLink', back_populates='role')

class UserProjectRoleLink(db.Model):
user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
project_id = Column(Integer, ForeignKey('project.id'), primary_key=True)
role_id = Column(Integer, ForeignKey('role.id'), primary_key=True)

user = relationship('User', back_populates='user_project_roles')
role = relationship('Role', back_populates='user_project_roles')
project = relationship('Project', back_populates='user_project_roles')

Поэтому всякий раз, когда я выбираю пользователя (select(User).where(User.id == id)), UserProjectRoleLink представляет собой таблицу, в которой user_id, role_id ,

Код: Выделить всё

project_id
загружаются, а связи, включая (циклические) отношения с пользователем, не загружаются.
Как я могу загрузить сведения о роли, а также сведения о проекте в рамках одного и того же выбора, но не загружать тысячи документов?
в моем Rest API я хотел бы ответить, например, ответом пользователя, например:

Код: Выделить всё

{
"id": 234,
"username": "JohnDoe",
"project_roles":[
{
"project_name":"Project 1",
"project_id": 1,
"role:"Admin",
"role_id": 1
},
{
"project_name":"Project 2",
"project_id": 2,
"role:"User",
"role_id": 2
}
]
}
Как я могу предварительно загрузить все связи между проектами и ролями (а не просто перебирать каждую из них и динамически загружать их (дорого)), но не взаимодействие с пользователем, поскольку это приведет к ошибке рекурсии?< /p>
Также со стороны проекта я хотел бы узнать, какой пользователь имеет доступ к конкретному проекту и с какими ролями
projectResult:

Код: Выделить всё

{
"id":2,
"project_name":"Project 1",
"users":[
{
"user_id": 234,
"user_name": JohnDoe,
"role":"Admin",
"role_id: "1",
}
]
}
Я поигрался с опциями joinLoading, но не знаю, как эффективно загружать каждую user_project_roles, поскольку (при входе от пользователя) я получаю список user_project_roles

Я также думал о вторичных объединениях, но безуспешно


Подробнее здесь: https://stackoverflow.com/questions/782 ... lationship
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»