如何在Flask SQLAlchemy中双向建立与辅助backref的数据库关系?

Joh*_*ton 1 python sqlalchemy has-many flask flask-sqlalchemy

我创建了一个User模型和Kid模型。在孩子模型中,我有:

parents = db.relationship('User', secondary=kids_users,
                        backref=db.backref('kids', lazy='dynamic'))
Run Code Online (Sandbox Code Playgroud)

辅助表定义如下所示:

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')))
Run Code Online (Sandbox Code Playgroud)

我的User模型不包含与此相关的任何内容,因为此代码可以完成所有操作。

情况是这样:当我查询时,some_kid.parents它返回了一个不错的数组:

[<User u'someuser@yahoo.com'>]
Run Code Online (Sandbox Code Playgroud)

但是当我查询周围的另一种方式时,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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用填充表单SomeForm(request.data, obj=some_user),并且它从不填充kids select字段,因为它不返回数组。

如何使它在两个方向上都能正常工作?

dav*_*ism 5

您已经使用了lazy='dynamic',它使关系返回另一个查询而不是一个集合。要实际获取集合,请致电some_kid.parents.all()。动态查询所拥有的方法append(instance)和remove(instance)管理集合。通常,lazy='dynamic'它用于非常大的集合,在装载任何相关实例之前,通常会对其进行进一步过滤。

通常,您只需要lazy='select'(默认值)指示SQLAlchemy使用自动select访问权限加载集合。然后它将表现为您期望的集合。