我在Flask应用程序中遇到SQLAlchemy问题,我有两个模型Instructor
和Student
,它们是同一模型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或者其他东西。谢谢!
答案 0 :(得分:1)
这是预期的行为,因为您正在使用single table inheritance:
单表继承表示单个表中所有子类的所有属性。具有该类唯一属性的特定子类将在表中的列中保留它们,否则如果该行引用不同类型的对象则为NULL。
虽然文档提到将属于其他类的列保留为NULL,但客户端默认您在插入user
表期间给出了列,这是继承自{{1}的所有类的基础即使他们不是特定子类的一部分也是如此。列。可能会使用context sensitive default function来避免这种情况,例如:
User
但这似乎是为避免一个相当小的问题而做的很多工作。