Вернуть None как класс в наследовании сущности на PonyORM

Когда я узнал о наследовании сущностей в 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.

Изначально я хотел сделать

  • сделать имя и пару стилей как уникальный идентификатор человека.

Например, между Томом как профессором и Томом как студентом должно быть по-другому.

Я думал, что это связано с другой проблемой db_session, но в таком случае, как я могу получить Person['Student', 'tom'] или же Student[None, 'tom']? У них есть другой способ сделать classtype а также name как PrimaryKey?

Может кто-нибудь сказать мне, что мне нужно попробовать? Я что-то пропустил?

PS, я проверил это на sqlite и PostgresSQL 9.5.1.

1 ответ

Решение

Спасибо за вопрос, это была ошибка, и я ее исправил.

Мы не обнаружили его раньше, потому что обычно столбец дискриминатора не включается в первичный ключ. Первичный ключ должен содержать уникальные значения, а значение столбца дискриминатора одинаково для всех объектов одного типа.

Другие вопросы по тегам