Я делаю проект, используя Flask, WTForms и SQLALchemy .
В моей модели есть формулы, которые имеют материалы, многие материалы представлены во многих формулах, и во многих формулах есть много материалов, также каждый материал в формуле имеет определенный атрибут c для представления этого, я использовал объект ассоциации из SQLALchemy.
Я хочу создать форма, позволяющая создать формулу, выбирающую необходимые материалы, а также присваивая каждому материалу соотношение. Я знаю, что привязать материал к формуле с помощью QuerySelectMultipleField можно, но я не знаю, как сделать форму, чтобы пользователи могли назначать пропорции для каждого выбранного материала.
Мои модели. py
class Ingredient(db.Model):
materia_id = db.Column(db.String(15), db.ForeignKey('materia.id'), primary_key=True)
formula_id = db.Column(db.Integer, db.ForeignKey('formula.id'), primary_key=True)
ratio = db.Column(db.Decimal, nullable=False)
materia = db.relationship('Materia', back_populates='formulas', passive_deletes='all')
formula = db.relationship('Formula', back_populates='materias', passive_deletes='all')
class Formula(db.Model):
id = db.Column(db.Integer, primary_key=True)
reactive_id = db.Column(db.String(15), db.ForeignKey('reactive.id'))
reactive = db.relationship('Reactive', back_populates='formula')
materias = db.relationship('Ingredient', back_populates='formula')
def __repr__(self):
return f"Formula('{self.id}')"
class Materia(db.Model):
id = db.Column(db.String(15), primary_key=True)
name = db.Column(db.String(100), nullable=False)
brand = db.Column(db.String(30), nullable=False)
measure = db.Column(db.Enum(Medida), nullable=False)
amount = db.Column(db.Decimal, nullable=False, default=0)
type = db.Column(db.String(20), nullable=False, default='Materia')
formulas = db.relationship('Ingredient', back_populates='materia')
def __repr__(self):
return f"Materia Prima('{self.name}', '{self.brand}', '{self.measure}')"
def materia_query():
return Materia.query.all()
My forms.py
class NewFormula(FlaskForm):
materia = QuerySelectMultipleField('Choose Materias',query_factory=materia_query, get_label='id')
submit = SubmitField('Enter')