SQLAlchemy:Subclassed模型db entry获取其他子类模型

时间:2018-06-17 10:21:23

标签: python sqlalchemy flask-sqlalchemy

我在Flask应用程序中遇到SQLAlchemy问题,我有两个模型InstructorStudent,它们是同一模型User的子类。当我创建Student对象时,它会在User下的数据库中列出,其属性对于Instructor应该是唯一的。这是我的(简化)课程:

class User(db.Model):
    __tablename__ = "user"
    discriminator = db.Column("type", db.String(50))  # Student or Instructor
    __mapper_args__ = {"polymorphic_on": discriminator}
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50)) 

class Instructor(User):
    __mapper_args__ = {"polymorphic_identity": "instructor"}
    reputation = db.Column(db.Integer, default=1)
    approved_for_teaching = db.Column(db.Boolean, default=False)

class Student(User):
    __mapper_args__ = {"polymorphic_identity": "student"}
    lessons_taken = db.Column(db.Integer, default=0)

我正在创建这样的Student

new_student = Student(name=user_name)
db.session.add(new_student)
db.session.commit()

但是当检查数据库中的对象时,学生从Instructor模型中获取属性,即reputation(值为1)和approved_for_teaching(值为False)。我在这里做错了什么,或者这是预期的行为?我可以理解列是否必须存在,因为它们在db中共享相同的表(User),但是我希望这些值为null或者其他东西。谢谢!

1 个答案:

答案 0 :(得分:1)

这是预期的行为,因为您正在使用single table inheritance

  

单表继承表示单个表中所有子类的所有属性。具有该类唯一属性的特定子类将在表中的列中保留它们,否则如果该行引用不同类型的对象则为NULL。

虽然文档提到将属于其他类的列保留为NULL,但客户端默认您在插入user表期间给出了列,这是继承自{{1}的所有类的基础即使他们不是特定子类的一部分也是如此。列。可能会使用context sensitive default function来避免这种情况,例如:

User

但这似乎是为避免一个相当小的问题而做的很多工作。