在PonyORM上的实体继承中返回None作为classtype

时间:2017-03-17 14:50:22

标签: python ponyorm

在我了解PonyORM的entity inheritance期间,由于我的好奇,我实施了以下内容:

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上进行了测试。

最初,我想做的是

  • 将name和classtype对作为person的唯一标识符。

例如,汤姆作为教授和汤姆作为学生应该有所不同。

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

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

p.s。,我在sqlite和PostgresSQL 9.5.1上测试过它。

1 个答案:

答案 0 :(得分:1)

感谢您的提问,这是一个错误而我fixed

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