Вернуть 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 ответ
Спасибо за вопрос, это была ошибка, и я ее исправил.
Мы не обнаружили его раньше, потому что обычно столбец дискриминатора не включается в первичный ключ. Первичный ключ должен содержать уникальные значения, а значение столбца дискриминатора одинаково для всех объектов одного типа.