1人以上のインストラクターが教えることができる製品(クラス)を用意するシステムがあります。これらのインストラクターは製品を作成することもできます。その場合、開発者として製品を介してアクセスできる必要があります。ただし、その製品を利用できるすべてのインストラクターにもアクセスできるようにしたいと思います。
SQLAlchemyモデルを設定して、の1対多の関係だけでProduct.developer
なく、の多対多の関係を設定する方法がわかりませんProduct.instructors
。
models.py
from app import db
instructors = db.Table('instructors',
db.Column('instructor_id', db.Integer, db.ForeignKey('instructor.id')),
db.Column('product_id', db.Integer, db.ForeignKey('product.id'))
)
class Instructor(db.Model):
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(64))
#courses qualified for etc
class Product(db.Model):
id = db.Column(db.Integer, primary_key = True)
courseName = db.Column(db.String(64))
developer = db.relationship('Instructor', secondary=instructors,
backref=db.backref('developed', lazy='dynamic'))
instructors = db.relationship('Instructor', secondary=instructors,
backref=db.backref('products', lazy='dynamic'))
def __repr__(self):
return '<Category> %r>' % (self.courseName)
views.py
from flask import render_template, flash, redirect
from app import app, models
@app.route('/product/<courseName>')
def show_product(courseName):
product = models.Product.query.filter_by(courseName=courseName).first_or_404()
return render_template('show-product.html', product=product)
テンプレート:show-product.html
<!-- extend base layout -->
{% extends "base.html" %}
{% block content %}
<br><b>Course Name:</b> {{product.courseName}}
<br><b>Curriculum developer:</b>
{% for developer in product.developer %}
{{developer.name}}
{% endfor %}
<br><b>Lead Instructor:</b>
<br><b>Certified Instructors:</b>
{% for instructor in product.instructors %}
{{instructor.name}}
{% endfor %}
{% endblock %}`enter code here`
これは、データベースに値を入れるために実行しているコードです。
#!flask/bin/python
from app import db, models
instruct1 = models.Instructor(name="instructor1")
db.session.add(instruct1)
db.session.commit()
instruct2 = models.Instructor(name="instructor2")
db.session.add(instruct2)
db.session.commit()
dev = models.Instructor(name="developer")
db.session.add(dev)
db.session.commit()
prod = models.Product(courseName = "test")
prod.instructors = [instruct1]
prod.instructors.append(instruct2)
prod.developer = [dev]
print "Instructors:"
for instructor in prod.instructors:
print instructor.name
print "Developer"
for i in prod.developer:
print i.name
db.session.add(prod)
db.session.commit()
そしてここに出力があります:
Instructors:
instructor1
instructor2
Developer
developer
しかし、Webページを表示すると、次のように表示されます。
Course Name: test
Curriculum developer: instructor1 instructor2 developer
Lead Instructor:
Certified Instructors: instructor1 instructor2 developer
更新:doobehに感謝します!コードhttp://bpaste.net/show/o8PtsY3Kvu8bxKnDEo24/を更新しましたが、Pythonコードを実行すると、「関係'Product.instructors'でbackref'製品'の作成中にエラーが発生しました:その名前のプロパティがマッパーに存在します」というエラーが表示されます。 'マッパー|インストラクター|インストラクター'