Boa tarde!
Estou desenvolvendo um projeto em Flask, usando o flask-sqlalchemy e sqlite, onde:
Estou realizando a definição de 3 tabelas que devem ter certos relacionamentos, mas não consegui fazer a definição completa das mesmas... Os relacionamentos são os seguintes:
Uma empresa pode ter vários usuários e varios estudos. Para cada estudo, podem estar relacionados diversos usuarios. Usuarios podem ser relacionados diversos estudos Usuarios de diferentes empresas não podem ser relacionados no mesmo estudo.
Outros pontos: Não podem existir usuarios sem empresas. Não podem existir estudos sem ao menos um usuário relacionado.
Dado esse conjunto de requisitos, consegui chegar no seguinte codigo:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///app.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy import Uuid, Float, String, ForeignKey, Integer
import uuid
class StudyUser(db.Model):
__tablename__ = 'study_user'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
user_id: Mapped[Uuid] = mapped_column(Uuid, ForeignKey('user.id')) #
study_id: Mapped[Uuid] = mapped_column(Uuid, ForeignKey('study.id')) #
class Company(db.Model):
__tablename__ = 'company'
id: Mapped[Uuid] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4())
name: Mapped[str] = mapped_column(String(32))
users = relationship('User', backref = 'empresa')
studies = relationship('Study', backref='empresa')
class User(db.Model):
__tablename__ = 'user'
id: Mapped[Uuid] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4())
name: Mapped[str] = mapped_column(String(32))
empresa_id: Mapped[Uuid] = mapped_column(Uuid, ForeignKey('company.id'))
studies = relationship('Study', secondary = StudyUser.__table__, backref = 'usuario')
class Study(db.Model):
__tablename__ = 'study'
id: Mapped[Uuid] = mapped_column(Uuid, primary_key=True, default=uuid.uuid4())
name: Mapped[str] = mapped_column(String(32))
company_id = mapped_column(Uuid, ForeignKey('company.id'))
O problema que encontrei é que ainda é possivel cadastrar usuários de diferentes empresas no mesmo estudo, e também é possível criar estudos associados à uma empresa, e ter somente usuários de outra empresa associados ao mesmo. Alguém possui uma indicação de como (ou mesmo se é possível) corrigir essa falha corrigindo a estrutura das tabelas?