我不确定如何表达这个问题,因为我不知道我要达到的目的的术语(mod,请随时提出改进建议)。
我有两种类型的用户,Student
和Instructor
。两者都可以具有一个或多个Tag
,基本上是一种类型(摇滚,放克等)。要将Student
和Instructor
与Tag
关联,我有一个关联表。
我有一个最后的模型Lesson
,它具有Student
和Instructor
的ID。在创建Lesson
时,仅根据创建它的Student
或Instructor
设置这些ID中的一个。如果Student
创建了Lesson
,我需要查找所有与Instructor
共同具有一个或多个Tag
的{{1}}。我该如何实现这一目标?我对数据库关系的了解有限,因此不胜感激!
这是模型的代码:
Student
我知道这在多个级别上是错误的,但是说我有一个class Instructor(db.Model):
id = db.Column(db.Integer, primary_key=True)
genres = db.relationship("Tag", secondary=instructor_tag_association_table, backref=db.backref("instructors", lazy="dynamic"))
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
genres = db.relationship("Tag", secondary=student_tag_association_table, backref=db.backref("students", lazy="dynamic"))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
genre = db.Column(db.String)
class Lesson(db.Model):
id = db.Column(db.Integer, primary_key=True)
instructor_id = db.Column(db.Integer, db.ForeignKey("instructor.id"))
student_id = db.Column(db.Integer, db.ForeignKey("student.id"))
# Association tables
instructor_tag_association_table = db.Table(
"instructor_tags",
db.Column("instructor_id", db.Integer, db.ForeignKey("instructor.id")),
db.Column("tag_id", db.Integer, db.ForeignKey("tag.id")),
)
student_tag_association_table = db.Table(
"student_tags",
db.Column("student_id", db.Integer, db.ForeignKey("student.id")),
db.Column("tag_id", db.Integer, db.ForeignKey("tag.id")),
)
的ID,那么我正在寻找这样的查询以查找课程:
Instructor
答案 0 :(得分:1)
如果我的解释正确,那么我认为问题的症结在于,您正在寻找的课程中有一个学生,但没有分配任何老师,该课程的学生genres
与老师的课程之间存在交集genres
。
我在您的student
模型上添加了instructor
和Lesson
关系,以补充您已经创建的Foreign Keys
,这使我更容易生成一些测试数据,如果没有别的:
class Lesson(db.Model):
id = db.Column(db.Integer, primary_key=True)
instructor_id = db.Column(db.Integer, db.ForeignKey("instructor.id"))
student_id = db.Column(db.Integer, db.ForeignKey("student.id"))
student = db.relationship(Student, uselist=False, backref='lessons')
instructor = db.relationship(Instructor, uselist=False, backref='lessons')
这是我生成的测试数据:
import random
db.drop_all()
db.create_all()
# create a set of tags
tags = [Tag(genre=g) for g in ('Jazz', 'Funk', 'Rock', 'Classical', 'Metal')]
# create 10 students with 2 tags randomly assigned
students = [Student(genres=random.sample(tags, 2)) for _ in range(10)]
# create 2 instructors with 2 tags randomly assigned
instructors = [Instructor(genres=random.sample(tags, 2)) for _ in range(2)]
# create a lesson for each student
lessons = [Lesson(student=s) for s in students]
db.session.add_all(tags + students + instructors + lessons)
db.session.commit()
然后对于查询,我查询了Lesson
与Student
和student_tag_association_table
的联接,以便可以找到带有Lesson
和{{1 }}与instructor_id == None
链接的Student
之一相匹配:
tag_id
然后进行测试:
Instructor's
由于测试数据是随机的,因此每次您将获得不同数量的tag_ids
输出。