2014-09-25 85 views
1

我创建了一个User模型和Kid模型。在儿童模式,我有:如何在Flask SQLAlchemy的两个方向上使用辅助backref工作来建立数据库关系?

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

辅助表的定义是这样的:

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模型不包含,因为这个代码做的一切与此相关的任何东西。

这里的情况:当我查询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'用于非常大的集合,您将在加载任何相关实例之前大多进行过滤。

通常,您只需要lazy='select'(默认值),它指示SQLAlchemy在访问时加载具有自动select的集合。然后它会像你期望的那样表现出一个集合。

相关问题