SQLAlchemy关系:查找具有一个或多个共同属性的实例

时间:2018-07-23 13:02:38

标签: python sqlalchemy

我不确定如何表达这个问题,因为我不知道我要达到的目的的术语(mod,请随时提出改进建议)。

我有两种类型的用户,StudentInstructor。两者都可以具有一个或多个Tag,基本上是一种类型(摇滚,放克等)。要将StudentInstructorTag关联,我有一个关联表。

我有一个最后的模型Lesson,它具有StudentInstructor的ID。在创建Lesson时,仅根据创建它的StudentInstructor设置这些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

1 个答案:

答案 0 :(得分:1)

我的回答是受enter image description here一个启发的。

如果我的解释正确,那么我认为问题的症结在于,您正在寻找的课程中有一个学生,但没有分配任何老师,该课程的学生genres与老师的课程之间存在交集genres

我在您的student模型上添加了instructorLesson关系,以补充您已经创建的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()

然后对于查询,我查询了LessonStudentstudent_tag_association_table的联接,以便可以找到带有Lesson和{{1 }}与instructor_id == None链接的Student之一相匹配:

tag_id

然后进行测试:

Instructor's

由于测试数据是随机的,因此每次您将获得不同数量的tag_ids输出。