언제 관계 / 역 참조를 사용할 수 있습니까?

Mbo42

관계 / 역 참조가 어떻게 작동하는지 이해하는 데 어려움을 겪고 있습니다. 나는 그들을 '라이브'로 만드는 방법에 관한 요점을 놓친 것 같아서 다음과 같은 오류가 계속 발생합니다
.'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')

나는 무슨 일이 일어나고 있는지 '가져 오지'않는다. 나는 관련된 원칙을 이해하려고 노력하고 있으므로 다음 문제에 당황하지 않습니다.

Loganasherjones

첫 번째 예제가 작동하지 않는 이유는 학생을 초기화 할 때 연결된 학교 구성원이 없기 때문입니다. 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

역 참조를 연관 배열 키로 사용할 수 있습니까?

분류에서Dev

별표 연산자를 사용한 역 참조는 언제 생략 할 수 있습니까?

분류에서Dev

다음 그룹의 역 참조를 어떻게 사용할 수 있습니까?

분류에서Dev

sed에서 역 참조를 대체 값으로 사용할 수 있습니까?

분류에서Dev

이 포인터를 역 참조 할 수 있습니까?

분류에서Dev

FluentMigrator를 사용하여 기존 관계에 계단식 삭제를 추가 할 수 있습니까?

분류에서Dev

사용할 관계를 어떻게 알 수 있습니까?

분류에서Dev

TokBox OTSubscriberKitNetworkStatsDelegate를 사용하여 대역폭을 계산할 수 있습니까?

분류에서Dev

여러 다른 테이블을 참조 할 수있는 외래 키 관계를 어떻게 제한 할 수 있습니까?

분류에서Dev

언제 공개 필드를 사용할 수 있습니까?

분류에서Dev

FreeBSD에서 OpenJDK 9를 언제 사용할 수 있습니까?

분류에서Dev

언제 메소드를 사용할 수 있고 언제 명령 줄 옵션을 사용할 수 있습니까?

분류에서Dev

SQLAlchemy 관계, 언제 어떤 관계를 사용합니까?

분류에서Dev

sed에서 파일 이름 대신 역 참조를 어떻게 사용할 수 있습니까?

분류에서Dev

HTML 코드가 파일링 시스템과 관계없이 무언가를 참조하도록 할 수 있습니까?

분류에서Dev

제한을 사용하여 hasMany 관계를 어떻게 설정할 수 있습니까?

분류에서Dev

함수의 const 값에 대한 const 참조를 언제 사용할까요?

분류에서Dev

Exists 키워드를 사용하지 않고 동등한 쿼리를 작성하여 관계 대수로 번역 할 수 있습니까?

분류에서Dev

C ++ 11의 std :: thread를 사용하면 언제 전역 변수를 스레드로부터 안전하게 수정할 수 있습니까?

분류에서Dev

클러스터 관리자 역할없이 argo를 사용할 수 있습니까?

분류에서Dev

testCafe에서 지역 변수를 사용할 수 있습니까?

분류에서Dev

@Component 선언에서 서비스 또는 전역 함수를 어떻게 사용할 수 있습니까?

분류에서Dev

powershell은 역 참조 일치에 메서드를 사용할 수 없습니다.

분류에서Dev

'new'의 반환을 역 참조하는 값에서 참조를 초기화 할 수 있습니까?

분류에서Dev

필드 분할에 임시 IFS를 언제 사용할 수 있습니까?

분류에서Dev

USERELATIONSHIP 함수는 관계에 참여하는 두 개의 열 참조 만 사용할 수 있습니다.

분류에서Dev

wpf에서 silverlight 참조를 사용할 수 있습니까?

분류에서Dev

매크로를 전역 적으로 #define 할 수 있습니까? (실시간 오류 검사기 참조)

분류에서Dev

Ubuntu 16.04 LTS에서 Landscape를 언제 사용할 수 있습니까?

Related 관련 기사

  1. 1

    역 참조를 연관 배열 키로 사용할 수 있습니까?

  2. 2

    별표 연산자를 사용한 역 참조는 언제 생략 할 수 있습니까?

  3. 3

    다음 그룹의 역 참조를 어떻게 사용할 수 있습니까?

  4. 4

    sed에서 역 참조를 대체 값으로 사용할 수 있습니까?

  5. 5

    이 포인터를 역 참조 할 수 있습니까?

  6. 6

    FluentMigrator를 사용하여 기존 관계에 계단식 삭제를 추가 할 수 있습니까?

  7. 7

    사용할 관계를 어떻게 알 수 있습니까?

  8. 8

    TokBox OTSubscriberKitNetworkStatsDelegate를 사용하여 대역폭을 계산할 수 있습니까?

  9. 9

    여러 다른 테이블을 참조 할 수있는 외래 키 관계를 어떻게 제한 할 수 있습니까?

  10. 10

    언제 공개 필드를 사용할 수 있습니까?

  11. 11

    FreeBSD에서 OpenJDK 9를 언제 사용할 수 있습니까?

  12. 12

    언제 메소드를 사용할 수 있고 언제 명령 줄 옵션을 사용할 수 있습니까?

  13. 13

    SQLAlchemy 관계, 언제 어떤 관계를 사용합니까?

  14. 14

    sed에서 파일 이름 대신 역 참조를 어떻게 사용할 수 있습니까?

  15. 15

    HTML 코드가 파일링 시스템과 관계없이 무언가를 참조하도록 할 수 있습니까?

  16. 16

    제한을 사용하여 hasMany 관계를 어떻게 설정할 수 있습니까?

  17. 17

    함수의 const 값에 대한 const 참조를 언제 사용할까요?

  18. 18

    Exists 키워드를 사용하지 않고 동등한 쿼리를 작성하여 관계 대수로 번역 할 수 있습니까?

  19. 19

    C ++ 11의 std :: thread를 사용하면 언제 전역 변수를 스레드로부터 안전하게 수정할 수 있습니까?

  20. 20

    클러스터 관리자 역할없이 argo를 사용할 수 있습니까?

  21. 21

    testCafe에서 지역 변수를 사용할 수 있습니까?

  22. 22

    @Component 선언에서 서비스 또는 전역 함수를 어떻게 사용할 수 있습니까?

  23. 23

    powershell은 역 참조 일치에 메서드를 사용할 수 없습니다.

  24. 24

    'new'의 반환을 역 참조하는 값에서 참조를 초기화 할 수 있습니까?

  25. 25

    필드 분할에 임시 IFS를 언제 사용할 수 있습니까?

  26. 26

    USERELATIONSHIP 함수는 관계에 참여하는 두 개의 열 참조 만 사용할 수 있습니다.

  27. 27

    wpf에서 silverlight 참조를 사용할 수 있습니까?

  28. 28

    매크로를 전역 적으로 #define 할 수 있습니까? (실시간 오류 검사기 참조)

  29. 29

    Ubuntu 16.04 LTS에서 Landscape를 언제 사용할 수 있습니까?

뜨겁다태그

보관