diff --git a/orm/db.go b/orm/db.go index 2958e345..1e3c996e 100644 --- a/orm/db.go +++ b/orm/db.go @@ -649,9 +649,12 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi if field.IsValid() { d.setColsValues(mmi, &field, mmi.fields.dbcols, trefs[:len(mmi.fields.dbcols)], tz) for _, fi := range mmi.fields.fieldsReverse { - if fi.reverseFieldInfo.mi == lastm { + if fi.inModel && fi.reverseFieldInfo.mi == lastm { if fi.reverseFieldInfo != nil { - field.Field(fi.fieldIndex).Set(last.Addr()) + f := field.Field(fi.fieldIndex) + if f.Kind() == reflect.Ptr { + f.Set(last.Addr()) + } } } } diff --git a/orm/models_info_m.go b/orm/models_info_m.go index 5ede53dd..5b1e60ec 100644 --- a/orm/models_info_m.go +++ b/orm/models_info_m.go @@ -66,6 +66,7 @@ func newModelInfo(val reflect.Value) (info *modelInfo) { fi.fieldIndex = i fi.mi = info + fi.inModel = true } if err != nil { diff --git a/orm/orm_test.go b/orm/orm_test.go index d734b9fb..8dc430af 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -745,6 +745,17 @@ func TestRelatedSel(t *testing.T) { num, err = qs.Filter("user__username", "slene").Count() throwFail(t, err) throwFail(t, AssertIs(num, 1)) + + var posts []*Post + qs = dORM.QueryTable("post") + num, err = qs.RelatedSel().All(&posts) + throwFail(t, err) + throwFailNow(t, AssertIs(num, 4)) + + throwFailNow(t, AssertIs(posts[0].User.UserName, "slene")) + throwFailNow(t, AssertIs(posts[1].User.UserName, "astaxie")) + throwFailNow(t, AssertIs(posts[2].User.UserName, "astaxie")) + throwFailNow(t, AssertIs(posts[3].User.UserName, "nobody")) } func TestSetCond(t *testing.T) {