何时关系/背景变得可用

时间:2016-02-19 13:28:52

标签: python sqlalchemy

我很难理解人际关系/背景如何运作。 我似乎错过了关于如何使它们生活的观点。所以我不断收到如下错误:
' NoneType'对象没有属性' decid'。

这些表是1比1形成heirachy。 我有一个SQLite数据库并定义了以下类。

class Person(DECLARATIVE_BASE):

    __tablename__ = 'person'
    __table_args__ = ({'sqlite_autoincrement': True})

    idperson = Column(INTEGER, autoincrement=True,
                      primary_key=True, nullable=False)
    lastname = Column(VARCHAR(45), index=True, nullable=False)
    firstname = Column(VARCHAR(45), index=True, nullable=False)

    def __repr__(self):
        return self.__str__()

    def __str__(self):
        return "<Person(%(idperson)s)>" % self.__dict__


class Schoolmember(DECLARATIVE_BASE):

    __tablename__ = 'schoolmember'

    person_id = Column(INTEGER, ForeignKey("person.idperson"),
                       index=True, primary_key=True, nullable=False)
    decid = Column(VARCHAR(45), unique=True, nullable=False)
    type = Column(VARCHAR(20), nullable=False)

    person = relationship("Person", foreign_keys=[person_id],
                          backref=backref("schoolmember", uselist=False))

    def __repr__(self):
        return self.__str__()

    def __str__(self):
        return "<Schoolmember(%(person_id)s)>" % self.__dict__


class Student(DECLARATIVE_BASE):

    __tablename__ = 'student'

    person_id = Column(INTEGER, ForeignKey("schoolmember.person_id"),
                      autoincrement=False, primary_key=True, nullable=False)
    studentnum = Column(VARCHAR(30), unique=True, nullable=False)
    year = Column(INTEGER, nullable=False)
    graduated = Column(BOOLEAN, default=0, nullable=False)

    schoolmember = relationship("Schoolmember", foreign_keys=[person_id],
                                backref=backref("student", uselist=False))

    def __repr__(self):
        return self.__str__()

    def __str__(self):
        return "<Student(%(person_id)s)>" % self.__dict__

我不明白为什么在这里我无法从学生那里获得学校成员。 我期待将这些关系升级为一种贬义。

newstu = Student()
newstu.studentnum = '3456'
newstu.schoolmember.decid = 'fred.frog'  # Error, 'NoneType' object  

以下是有效的,但只是通过踩踏在课堂上定义的关系? 我需要这样做吗?

s = Schoolmember(decid = 'fred.frog')
newstu = Student(schoolmember=s, studentnum='3456')

我没有得到&#39;到底是怎么回事。我试图理解所涉及的校长,所以我不会被下一个问题弄清楚

1 个答案:

答案 0 :(得分:0)

你的第一个例子不起作用的原因是因为当你初始化学生时,没有与之相关的学校成员。 SQLAlchemy不会自动为您生成此内容。如果您愿意,每次为其创建Student对象以自动创建新的学校成员时,您都可以在__init__内完成。此外,如果您希望它能够工作,您可以执行以下操作:

student = Student()
schoolmember = Schoolmember()
student.studentnum = 3456
student.schoolmember = schoolmember
student.schoolmember.decid = 'fred.frog'

__init__方法也可以提供帮助,如果这是您每次都想要的行为。

def __init__(self, studentnum=None, year=None, graduated=None, schoolmember=None):
    # If no schooolmember was provided, automatically generate one.
    self.schoolmember = schoolmember or Schoolmember()

希望这有帮助。