Return None 作为 PonyORM 实体继承中的类类型

Return None as classtype in entity inheritance on PonyORM

在了解entity inheritance PonyORM 期间,出于好奇,我实现了以下内容:

from pony.orm import *


db = Database()


class Person(db.Entity):
    classtype = Discriminator(str)
    name = Required(str)
    PrimaryKey(classtype, name)


class Student(Person):
    professors = Set('Professor')


class Professor(Person):
    students = Set('Student')


db.bind("sqlite", "entity.sqlite", create_db=True)
db.generate_mapping(create_tables=True)

with db_session:
    student_tom = Student(name='tom')
    print(student_tom)
print(student_tom)

with db_session:
    tom = Person['Student', 'tom']
    print(tom)
print(tom)

我期望的输出如下:

Student['Student',u'tom']
Student['Student',u'tom']
Student['Student',u'tom']
Student['Student',u'tom']

但是,实际结果是这样的:

Student['Student',u'tom']
Student['Student',u'tom']
Student[None,u'tom']
Student[None,u'tom']

我在 IPython 和 运行 等交互式控制台上将其作为 python 文件进行了测试。但是,两者的结果是一样的。它在 Python 2.7.10 和 Python 3.6.0.

上测试

本来我想做的是

例如,作为教授的 Tom 和作为学生的 Tom 应该是不同的。

我认为它与不同的 db_session 问题有关,但在那种情况下,我如何检索 Person['Student', 'tom']Student[None, 'tom']?他们有不同的方法将 classtypename 作为主键吗?

有人可以告诉我我需要尝试什么吗?我错过了什么吗?

p.s., 我已经在 sqlite 和 PostgresSQL 9.5.1 上测试过了。

感谢您的询问,这是一个错误,我 fixed 它。

我们没有早点发现它,因为通常鉴别器列不包含在主键中。主键应包含唯一值,鉴别器列值对于同一类型的所有对象都是相同的。