2014-10-20 21 views
0

對不起,如果標題不清楚,想不到一個好的方式來制定它。 目前我檢查,如果它沒有父視圖則顯示它 我想這個改變控制器(顯然)數據庫有兩種不同的表格要求

我的表:

db.define_table('comments', 
      Field('parent_id', 'reference comments', readable=False, writable=False), 
      Field('body', 'text', label='Message', requires=IS_NOT_EMPTY()), 
      auth.signature) 

db.define_table('comments_users', 
      Field('user_id', 'reference auth_user', requires=IS_NOT_EMPTY()), 
      Field('comments_id', 'reference comments', requires=IS_NOT_EMPTY()), 
      Field('permission', 'integer', requires=IS_NOT_EMPTY())) 

的選擇我想那並不是」將不起作用:

rows = db(
      (db.comments_users.user_id==auth.user.id) & 
      (db.comments_users.comments_id.parent_id==0) # something like this is possible in view with a single row 
     ).select(limitby=(0, 10)) 

我現在做中,我想改變控制器

{{for row in rows:}} 
    {{if row.comments_id.parent_id==0:}} 
     <td>{{=row.comments_id}}</td> 
    {{pass}} 
{{pass}} 
視圖

回答

1

首先,請注意row.comments_id.parent_idrecursive select - 對於每一行,它都執行單獨的選擇,獲取由row.comments_id標識的db.comments記錄。循環遍歷所有記錄時效率不高,因此不推薦。

遞歸選擇概念不適用於查詢,因此您不能像查詢中那樣執行db.comments_users.comments_id.parent_id == 0。然而,你可以做同樣的事情,以創建一個子查詢:

no_parents = db.comments_users.comments_id.belongs(db.comments.parent_id == 0) 
db((db.comments_users.user_id == auth.user_id) & no_parents).select(limitby(0, 10)) 

當應用belongs方法的引用類型字段,並通過在查詢時,會自動生成一個子查詢。有關更多詳細信息,請參閱belongs documentation。通過行循環時

db((db.comments_users.user_id == auth.user_id) & 
    (db.comments.parent_id == 0) & 
    (db.comments.id == db.comments_users.comments_id)).select(limitby(0, 10)) 

在這種情況下,雖然:

注意,而不是子查詢,它可能是更有效地做一個連接(你可以檢查db._timings或使用response.toolbar()調查) ,則需要引用表名和字段名(例如,row.comments.id,row.comments_users.permission等),因爲每個對象都將包含來自兩個表的字段。

+0

非常感謝你 我在嘗試加入之前遇到的問題是我忘記了(db.comments.id == db.comments_users.comments_id)),這只是我身邊的愚蠢。 – PrivateerGerrit 2014-10-20 17:33:33

相關問題