95c65de9 by slene

fix #440

1 parent ef79a2b4
...@@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) { ...@@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) {
112 names = append(names, fi.name) 112 names = append(names, fi.name)
113 mmi = fi.relModelInfo 113 mmi = fi.relModelInfo
114 114
115 if fi.null { 115 if fi.null || t.skipEnd {
116 inner = false 116 inner = false
117 } 117 }
118 118
...@@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) { ...@@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) {
189 func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) { 189 func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) {
190 var ( 190 var (
191 jtl *dbTable 191 jtl *dbTable
192 fi *fieldInfo
193 fiN *fieldInfo
192 mmi = mi 194 mmi = mi
193 ) 195 )
194 196
...@@ -197,9 +199,24 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string ...@@ -197,9 +199,24 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string
197 199
198 inner := true 200 inner := true
199 201
202 loopFor:
200 for i, ex := range exprs { 203 for i, ex := range exprs {
201 204
202 fi, ok := mmi.fields.GetByAny(ex) 205 var ok, okN bool
206
207 if fiN != nil {
208 fi = fiN
209 ok = true
210 fiN = nil
211 }
212
213 if i == 0 {
214 fi, ok = mmi.fields.GetByAny(ex)
215 }
216
217 // fmt.Println(ex, fi.name, fiN)
218
219 _ = okN
203 220
204 if ok { 221 if ok {
205 222
...@@ -217,13 +234,20 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string ...@@ -217,13 +234,20 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string
217 mmi = fi.reverseFieldInfo.mi 234 mmi = fi.reverseFieldInfo.mi
218 } 235 }
219 236
237 if i < num {
238 fiN, okN = mmi.fields.GetByAny(exprs[i+1])
239 }
240
220 if isRel && (fi.mi.isThrough == false || num != i) { 241 if isRel && (fi.mi.isThrough == false || num != i) {
221 if fi.null { 242 if fi.null || t.skipEnd {
222 inner = false 243 inner = false
223 } 244 }
224 245
225 if num == i && t.skipEnd { 246 if t.skipEnd && okN || !t.skipEnd {
226 } else { 247 if t.skipEnd && okN && fiN.pk {
248 goto loopEnd
249 }
250
227 jt, _ := t.add(names, mmi, fi, inner) 251 jt, _ := t.add(names, mmi, fi, inner)
228 jt.jtl = jtl 252 jt.jtl = jtl
229 jtl = jt 253 jtl = jt
...@@ -231,34 +255,40 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string ...@@ -231,34 +255,40 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string
231 255
232 } 256 }
233 257
234 if num == i { 258 if num != i {
235 if i == 0 || jtl == nil { 259 continue
236 index = "T0" 260 }
237 } else {
238 index = jtl.index
239 }
240 261
241 info = fi 262 loopEnd:
242 263
243 if jtl == nil { 264 if i == 0 || jtl == nil {
244 name = fi.name 265 index = "T0"
245 } else { 266 } else {
246 name = jtl.name + ExprSep + fi.name 267 index = jtl.index
247 } 268 }
248 269
249 switch { 270 info = fi
250 case fi.rel:
251 271
252 case fi.reverse: 272 if jtl == nil {
253 switch fi.reverseFieldInfo.fieldType { 273 name = fi.name
254 case RelOneToOne, RelForeignKey: 274 } else {
255 index = jtl.index 275 name = jtl.name + ExprSep + fi.name
256 info = fi.reverseFieldInfo.mi.fields.pk 276 }
257 name = info.name 277
258 } 278 switch {
279 case fi.rel:
280
281 case fi.reverse:
282 switch fi.reverseFieldInfo.fieldType {
283 case RelOneToOne, RelForeignKey:
284 index = jtl.index
285 info = fi.reverseFieldInfo.mi.fields.pk
286 name = info.name
259 } 287 }
260 } 288 }
261 289
290 break loopFor
291
262 } else { 292 } else {
263 index = "" 293 index = ""
264 name = "" 294 name = ""
......
...@@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) { ...@@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) {
1561 num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count() 1561 num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count()
1562 throwFail(t, err) 1562 throwFail(t, err)
1563 throwFail(t, AssertIs(num, 1)) 1563 throwFail(t, AssertIs(num, 1))
1564
1565 qs = dORM.QueryTable("comment")
1566 num, err = qs.Count()
1567 throwFail(t, err)
1568 throwFail(t, AssertIs(num, 6))
1569
1570 qs = dORM.QueryTable("post")
1571 num, err = qs.Filter("Id", 3).Delete()
1572 throwFail(t, err)
1573 throwFail(t, AssertIs(num, 1))
1574
1575 qs = dORM.QueryTable("comment")
1576 num, err = qs.Count()
1577 throwFail(t, err)
1578 throwFail(t, AssertIs(num, 4))
1579
1580 fmt.Println("...")
1581 qs = dORM.QueryTable("comment")
1582 num, err = qs.Filter("Post__User", 3).Delete()
1583 throwFail(t, err)
1584 throwFail(t, AssertIs(num, 3))
1585
1586 qs = dORM.QueryTable("comment")
1587 num, err = qs.Count()
1588 throwFail(t, err)
1589 throwFail(t, AssertIs(num, 1))
1564 } 1590 }
1565 1591
1566 func TestTransaction(t *testing.T) { 1592 func TestTransaction(t *testing.T) {
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!