2014-09-25 5 views
1

User 모델과 Kid 모델을 만들었습니다. 아이 모델에서 내가 가진 :플라스크 SQLAlchemy에서 보조 리플렉션 작업과 DB 관계를 양방향으로 만드는 방법은 무엇입니까?

kids_users = db.Table('kids_users', 
    db.Column('kid_id', db.Integer(), db.ForeignKey('kid.id')), 
    db.Column('user_id',db.Integer(), db.ForeignKey('user.id'))) 

그리고 내 User 모델이 코드는 모든 않기 때문에이 관련된 것도 포함되어 있지 않습니다

parents = db.relationship('User', secondary=kids_users, 
         backref=db.backref('kids', lazy='dynamic')) 

보조 테이블 정의는 다음과 같습니다. 여기

상황이다 : 나는 some_kid.parents를 쿼리 할 때 그것이 좋은 배열 날 다시 제공 :

[<User u'[email protected]'>] 

을하지만 some_user.kids 다른 방법으로 주위를 조회 할 때 어떤 SQL 쿼리 날 다시 제공 :

SELECT kid.id AS kid_id, kid.first_name AS kid_first_name, kid.middle_name AS kid_middle_name, kid.last_name AS kid_last_name, kid.dob AS kid_dob, kid.profile_pic_small AS kid_profile_pic_small, kid.profile_pic_smallish AS kid_profile_pic_smallish, kid.profile_pic_med AS kid_profile_pic_med, kid.profile_pic_large AS kid_profile_pic_large, kid.gender AS kid_gender, kid.current_group AS kid_current_group, kid.status AS kid_status, kid.status_time AS kid_status_time, kid.potty_trained AS kid_potty_trained, kid.pending AS kid_pending, kid.scholarship AS kid_scholarship, kid.govt AS kid_govt, kid.extra_credit AS kid_extra_credit, kid.hold AS kid_hold, kid.school_id AS kid_school_id, kid.between_schedule_id AS kid_between_schedule_id, kid.one_for_all_schedule_id AS kid_one_for_all_schedule_id, kid.hourly_schedule_id AS kid_hourly_schedule_id, kid.calendar_schedule_id AS kid_calendar_schedule_id, kid.code AS kid_code FROM kid, kids_users 

양식을 SomeForm(request.data, obj=some_user)으로 채우려고하는데 배열을 반환하지 않으므로 select 키 필드를 채우지 않습니다.

양방향으로 잘 작동하려면 어떻게해야합니까?

답변

4

lazy='dynamic'을 사용 했으므로 관계가 컬렉션이 아닌 다른 쿼리를 반환합니다. 컬렉션을 실제로 받으려면 some_kid.parents.all()으로 전화하십시오. 동적 쿼리는 append(instance)remove(instance) 메서드를 사용하여 컬렉션을 관리합니다. 일반적으로 lazy='dynamic'은 관련 인스턴스를로드하기 전에 대부분 필터링 할 매우 큰 컬렉션에 사용됩니다.

일반적으로 액세스시 자동으로 select으로 컬렉션을로드하도록 SQLAlchemy에 지시하는 lazy='select' (기본값)이 필요합니다. 그러면 예상대로 컬렉션으로 작동합니다.