2017-12-15 7 views
0

Ich habe zwei Klassenmodelle, die in zwei MySQL-Datenbanktabellen übersetzt werden. Einer ist employees und der andere ist projects. Sie haben eine Eins-zu-Viele-Beziehung, d. H. Ein Projekt kann mehrere Mitarbeiter haben. In meinem Webformular bei der Registrierung eines Mitarbeiters habe ich ein Drop-down mit den Projekten. Tabelle employees, hat einen Fremdschlüssel, der auf projects Tabelle referenziert, und daher hat die employees Tabelle eine Integer Spalte (emp_project_id) als Fremdschlüssel aus der projects Tabelle. Wie speichere ich die ID, wenn ein Projekt aus dem Dropdown-Menü ausgewählt wird?So speichern Sie die ID des ausgewählten Dropdown-Wertes in SQLAlchemy

class Employee(UserMixin, db.Model): 
    """ 
    Create Employee table 
    """ 

    # Ensures table will be named in plural and not in singular 
    # as in the name of the model 
    __tablename__ = 'employees' 

    id = db.Column(db.Integer, primary_key=True) 
    emp_number = db.Column(db.String(10), index=True, unique=True, nullable=False) 
    username = db.Column(db.String(60), index=True, unique=True) 
    email = db.Column(db.String(60), index=True, unique=True, nullable=False) 
    emp_name = db.Column(db.String(100), index=True) 
    password_hash = db.Column(db.String(128)) 
    emp_project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False) 

Und hier ist die projects Tabelle

class Project(db.Model): 
    """ 
    Create a Project table 
    """ 

    __tablename__ = 'projects' 

    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(60), unique=True, nullable=False) 
    description = db.Column(db.String(200), nullable=False) 

    pro_subprojects = db.relationship('Subproject', backref='sp_project', 
           lazy='dynamic') 
    pro_employees = db.relationship('Employee', backref='emp_project', 
           lazy='dynamic') 

verweisen mich freundlich auf eine Ressource, die ich auch durch, wenn möglich, gehen, da ich nicht die Lösung in ihrer Dokumentation gefunden haben.

ist die Klasse von forms.py, die das Formular hier

class RegistrationForm(FlaskForm): 
    """ 
    Form for users to create new account 
    """ 
    project = QuerySelectField(query_factory=lambda: Project.query.all(), 
                get_label="name") 
    subproject = QuerySelectField(query_factory=lambda: Subproject.query.all(), 
                get_label="name") 
    emp_number = StringField('Employee Number', validators=[DataRequired()]) 
    email = StringField('Email', validators=[DataRequired(), Email()]) 
    username = StringField('Username', validators=[DataRequired()]) 
    emp_name = StringField('Full Name', validators=[DataRequired()]) 
    password = PasswordField('Password', validators=[ 
              DataRequired(), 
              EqualTo('confirm_password') 
             ]) 
    confirm_password = PasswordField('Confirm Password') 
    submit = SubmitField('Register') 

schafft das, was ich auf meinem views.py hinzugefügt haben:

@auth.route('/register', methods=['GET', 'POST']) 
def register(): 
    """ 
    Handle requests to the /register route 
    Add an employee to the database through the registration form 
    """ 
    form = RegistrationForm() 
    if form.validate_on_submit(): 
     employee = Employee(project=form.project.data, 
          subproject=form.subproject.data, 
          emp_number=form.emp_number.data, 
          email=form.email.data, 
          username=form.username.data, 
          emp_name=form.emp_name.data, 
          password=form.password.data) 

     # add employee to the database 
     db.session.add(employee) 
     db.session.commit() 
     flash('You have registered successfully. You can now log in.') 

Wenn ich versuche jedoch einen Mitarbeiter zu registrieren, erhalte ich eine Fehler wie TypeError: 'project' is an invalid keyword argument for Employee. Mit freundlicher

+0

Folgen Sie diesem Tutorial? : https://scotch.io/tutorials/build-a-crud-web-app-with-python-and-flask-part-one –

+0

Sicher. Ich folge diesem, obwohl ich etwas anderes entwickle –

+0

sollten Sie alle Elemente aus HTML-Formular im Wörterbuch haben [flask.request.form] (http://flask.pooco.org/docs/0.12/quickstart/#the- Anfrage-Objekt) – furas

Antwort

0

hier helfen ist, was in the documentation for QuerySelectedField gesagt:

Die Dateneigenschaft tatsächlich speichern/ORM Modellinstanz hält, nicht die ID. Jetzt

Ich verstehe Ihr Problem wie dies Ihrer Meinung nach ändern:

@auth.route('/register', methods=['GET', 'POST']) 
def register(): 
    """ 
    Handle requests to the /register route 
    Add an employee to the database through the registration form 
    """ 
    form = RegistrationForm() 
    if form.validate_on_submit(): 
     employee = Employee(
          emp_number=form.emp_number.data, 
          email=form.email.data, 
          username=form.username.data, 
          emp_name=form.emp_name.data, 
          password=form.password.data) 
     project=form.project.data #an instance of Project Class 
     subproject=form.subproject.data #an instance of SubProject Class 
     project.pro_subproject.append(subproject) 
     project.pro_employee.append(employee) 
     # add employee to the database 
     db.session.add(employee) 
     db.session.add(subproject) 
     db.session.add(project) 
     db.session.commit() 
     flash('You have registered successfully. You can now log in.') 

Here is an explanation of that :

A one to many Beziehungen stellt einen Fremdschlüssel auf der untergeordneten Tabelle Referenzierung der Eltern. Beziehung() wird dann auf den Eltern angegeben, als eine Sammlung von Gegenständen Referenzierung durch das Kind dargestellt wird:

Das bedeutet in Ihrer Projekttabelle des Feld pro_employees und pro_subproject sind Listen von Mitarbeitern (n) und Unterprojekt (n).

+0

Ich denke, wir sind fast da, @EspoirMurhabazi.Ich bekomme jetzt einen Fehler, dass 'emp_project_id' nicht' null' sein kann. Wenn die Daten an die Datenbank gesendet werden, bleibt das Feld 'emp_project_id' leer, aber es ist ein Fremdschlüssel, also' not null' –

+0

Versuchen Sie, das Projekt zu drucken, um zu prüfen, ob es nicht null ist, und speichern Sie das Projekt zuerst Setzen Sie also db.session.add (Projekt) vor den Mitarbeitern –

Verwandte Themen