我很难理解人际关系/背景如何运作。
我似乎错过了关于如何使它们生活的观点。所以我不断收到如下错误:
' 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;到底是怎么回事。我试图理解所涉及的校长,所以我不会被下一个问题弄清楚
答案 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()
希望这有帮助。