2017-10-06 3 views
0

Ich habe eine Tabelle für Protokolle, die verschiedene Informationen über Mitarbeiter ex enthält:Wie machst du viele zu viele mit mehr als 2 Tischen?

class Log(Model): 
    division_id = Column(Integer, ForeignKey('division.id'), nullable=False) 
    division = relationship("Division") 

    employee_id = Column(Integer, ForeignKey("employee.id"), nullable=False) 
    employee = relationship("Employee") 

    skill_id = Column(Integer, ForeignKey("skill.id"), nullable=False) 
    skill = relationship("Skill") 

    message = Column(String, default='OK', nullable=False) 
    date = Column(DateTime, default=NowTime(), nullable=True) 

Mitarbeiter und Geschicklichkeit Tabellen wie folgt aussehen:

class Employee(Model): 
    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True, nullable=False) 
    division_id = Column(Integer, ForeignKey('division.id'), nullable=False) 
    division = relationship("Division") 

class Skill(Model): 
    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True, nullable=False) 

ich bin derzeit mit Flask-AppBuilder und ich habe Skill-Ansicht, die alle Protokolle für die aktuell ausgewählte Fähigkeit anzeigt.

In der SkillLogView möchte ich auch eine Liste von Mitarbeiternamen anzeigen, die diese Fähigkeit haben.

Wie bekomme ich auch die Mitarbeiter aus den Protokollen, die zu den aktuellen Fähigkeiten gehören?

Ich bin nicht sicher, wie es geht, aber ich dachte, dass es für viele zu viele ein Fall sein könnte. Das Problem ist, dass es 3 Tabellen gibt, nicht 2.

Gibt es eine Möglichkeit, viele zu viele mit mehr als 2 Tabellen zu tun?

Oder gibt es einen anderen Weg, um das zu erreichen, was ich tun möchte?

Jede Hilfe wird geschätzt.

Antwort

0

Ihre Employee eingeführt hat keine Beziehung zu Log, so Employee Abfrage mit Log-Join für ein Prädikat schwierig ist.

Sie können jedoch einfach abfragen, um die Log für employee_id mit dem skill_id als Unterabfrage, und holen Employee mit dem angegebenen Ergebnis.

# Subquery returns `employee_id` from `logs` with the given `skill_id` 
sq = session.query(Log.employee_id).\ 
    filter(Log.skill_id == skill_id).\ 
    subquery() 

# Fetch `Employee` that matches `employee_id` in `sq` 
q = session.query(Employee).\ 
    filter(Employee.employee_id.in_(sq)) 

employees = q.all() # or paginate, e.g. q.limit(..).all() 
+0

Danke für die Hilfe Ivan! Außerdem habe ich eine andere Methode veröffentlicht, die es auf der Ebene des Tabellenmodells implementiert. Überprüfen Sie es, wenn Sie Zeit haben. –

+0

Danke für das Teilen. Ich habe erwähnt, dass Ihr Mitarbeiter keine Beziehung mit Log etabliert hat. Dies ist genau das, was Ihre andere Methode befürwortet. –

0

Es gibt ein Beispiel online, das genau diese Sache macht!

Es hat eine Person Tabelle, Auto Tabelle, Auto Besitz Tabelle.

Alles, was ich tun musste, war Mitarbeiter für Person, Geschicklichkeit für das Auto zu ersetzen und für den Autobesitz anmelden.

Reference URL: Many-to-Many with association object and all relationships defined crashes on delete

Aktualisiert Code:

class Log(Model): 
    division_id = Column(Integer, ForeignKey('division.id'), nullable=False) 
    division = relationship("Division") 

    employee_id = Column(Integer, ForeignKey("employee.id"), nullable=False) 
    employee = relationship("Employee", backref=backref('log', passive_deletes='all')) 

    skill_id = Column(Integer, ForeignKey("skill.id"), nullable=False) 
    skill = relationship("Skill", backref=backref('log', passive_deletes='all')) 

    message = Column(String, default='OK', nullable=False) 
    date = Column(DateTime, default=NowTime(), nullable=True) 


class Skill(Model): 
    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True, nullable=False) 

    employees = relationship('Employee', secondary='log', backref='skill') 


class Employee(Model): 
    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True, nullable=False) 

    division_id = Column(Integer, ForeignKey('division.id'), nullable=False) 
    division = relationship("Division") 

    skills = relationship('Skill', secondary='log', backref='employee')