Возвратите 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 первичным ключом?

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

p.s., я тестировал его на sqlite и PostgresSQL 9.5.1.


person sangheestyle    schedule 17.03.2017    source источник


Ответы (1)


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

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

person Alexander Kozlovsky    schedule 21.03.2017
comment
Спасибо за исправление. Я проверил ваш патч, и он работает хорошо. Даже я исправил ту же часть, и она работала хорошо, но еще не пиарила проект. Я сделаю это в следующий раз, если я найду другой. Спасибо. Я согласился с вашей точкой зрения на столбец дискриминатора как часть первичного ключа. Итак, я попытался изменить свою модель, но пока не нашел лучшего способа. :) - person sangheestyle; 21.03.2017