관계 / 역 참조가 어떻게 작동하는지 이해하는 데 어려움을 겪고 있습니다. 나는 그들을 '라이브'로 만드는 방법에 관한 요점을 놓친 것 같아서 다음과 같은 오류가 계속 발생합니다
.'NoneType '객체에는'결정 '속성이 없습니다.
이 테이블은 1 대 1로 heirachy를 형성합니다. SQLite db와 다음 클래스가 정의되어 있습니다.
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__
왜 여기에서 Student에서 학교 회원에 액세스 할 수 없는지 이해할 수 없습니다. 나는 선언적 관계가 계단식으로 올라갈 것이라고 기대했습니다.
newstu = Student()
newstu.studentnum = '3456'
newstu.schoolmember.decid = 'fred.frog' # Error, 'NoneType' object
다음은 작동하지만 클래스에 정의 된 관계를 밟아야 만합니까? 내가 할 필요가 이런 식으로 할?
s = Schoolmember(decid = 'fred.frog')
newstu = Student(schoolmember=s, studentnum='3456')
나는 무슨 일이 일어나고 있는지 '가져 오지'않는다. 나는 관련된 원칙을 이해하려고 노력하고 있으므로 다음 문제에 당황하지 않습니다.
첫 번째 예제가 작동하지 않는 이유는 학생을 초기화 할 때 연결된 학교 구성원이 없기 때문입니다. 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()
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다