2017-05-02 4 views
0

Ich habe zwei Modelle, Company und Employee, in einer Viele-zu-eins-Beziehung. Sie sind in verschiedenen Flask-Blaupausen definiert. Ich versuche, eine Kaskade hinzuzufügen, die mich dazu bringt, eine Beziehung auf Company zu definieren (anstatt nur eine Beziehung auf Employee mit backref festgelegt).SQLAlchemy mit Flask Blaupausen: kreisförmige Importe

company_blueprint/models.py:

class Company(Base): 
    id = Column(Integer, primary_key=True) 
    employees = relationship("Employee", back_populates="company", cascade="all") 

employee_blueprint/models.py:

from app.company_blueprint.models import Company 
class Employee(Base): 
    name = Column(String) 
    company_id = Column(ForeignKey(Company.id)) 
    company = relationship("company", back_populates="employees") 

Das Problem ist, wenn ich versuche, eine Firma in company_blueprint/views.py zu löschen, die Employee Modell nicht geladen . Ich bekomme:

sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper|Company|company, expression 'Employee' failed to locate a name ("name 'Employee' is not defined"). If this is a class name, consider adding this relationship() to the <class 'app.company_model.models.Company'> class after both dependent classes have been defined. 

Ich könnte versuchen, Mitarbeiter in company_blueprint.models, zu importieren, aber dann in ein kreisförmigen Import Problem, das ich renne.

Wie behebe ich das?

bearbeiten: Dank paradoxis, denn jetzt auf Ich habe folgendes angesiedelt:

  • Strings auf Fremdschlüsselspalten zu beziehen, zum Beispiel company_id = Column(ForeignKey("company.id"))
  • In meinem app.py, erste Import alle Modelle vor irgendetwas anderes, das heißt

-

import flask 
import app.employee_blueprint.models 
import app.company_blueprint.models 

# import other views, modules, etc. 

Das fühlt sich immer noch ein wenig umständlich.

+0

Verwenden Sie Ihre Tabellennamen als String als 'ForeignKey ("Company.id")' Argument und verwenden Sie die Klassennamen als String in Ihrer Beziehung 'Beziehung ("Gesellschaft", ..' – Paradoxis

+0

@Paradoxis Dies hilft mir, den Import von employee_blueprint/models.py nach company_blueprint/models.py zu verschieben, aber dann stoße ich auf der anderen Seite auf das Problem (employee_blueprint/views.py könnte das Unternehmen nicht kennen.) – Mark

+0

move all deine Modelle in ein separates Paket, importiere sie alle in die __init__.py und importiere sie dann von dort in deinen Ansichten, funktioniert für mich :) – Paradoxis

Antwort

0

Ich verwende solche Beziehungen in den meisten Modellklassen. Meines Erachtens braucht man in beiden Klassen keine besondere Sache oder Beziehung. Fügen Sie einfach eine Beziehung in der übergeordneten Modellklasse hinzu und fügen Sie eine backref hinzu, es wird funktionieren.

class Company(Base): 
    id = Column(Integer, primary_key=True) 
    employees = relationship("Employee", backref="company", cascade="all, delete-orphan") 
Verwandte Themen