2015-03-30 56 views
1

我是一般的Web2py和SQL數據庫的新手,所以如果這是一個愚蠢的問題,請原諒我。使用Web2py/Python在SQLite中引用另一個表格

我想要做的是創建一個窗體,從SQL表字段中提取相關數據(類型,標籤,IS_NOT_EMPTY()等)以在前端填充和配置輸入元素。到目前爲止,我已經成功地使用Web2py Manual作爲一個很好的參考。

我已經到了想要使用多個表來幫助更有效地對數據集進行分類的地步。最好的情況是有一個可以在我的控制器文件(default.py)中調用的主表,它與我的數據庫中的其他相關(但並非總是需要)表相關聯。

在下面的代碼中,您可以看到我先定義'category_t'表,然後定義'new_product'表。然後我嘗試在new_product的'main_category'字段內引用'category_t'表。 'main_category'字段最終成爲窗體上的多重選擇元素,這正是我想要的。我只需要使用'category_t'中的字段標籤作爲多選選項。

我正在使用這個Links to referencing records指令從Web2py手冊,但我相信我誤解了它的實際能力。我迫切需要有人來教我關於Web2py和SQLite的規律。

db.define_table(
    'category_t', 
    Field('category1', 'boolean', label='Category 1'), 
    Field('category2', 'boolean', label='Category 2'), 
    Field('category3', 'boolean', label='Category 3'), 
) 

db.define_table(
    'new_product', 
    Field('name', requires=[IS_NOT_EMPTY(), IS_ALPHANUMERIC()], label='Product Name'), 
    Field('sku', requires=[IS_NOT_EMPTY(), IS_ALPHANUMERIC()], label='SKU'), 
    Field('build', requires=IS_IN_SET(['Build1','Build2','Build3']), label='Product Type'), 
    Field('main_category', 'list:reference category_t', label='Category'), 
) 



更新

我發現,這是因爲加入您的主表中的輔助表得到它顯示在前端一樣簡單。我還沒有檢查它是否能夠沒有錯誤地更新。

db.define_table(
    'new_product', 
    Field('name', requires=[IS_NOT_EMPTY(), IS_ALPHANUMERIC()], label='Product Name'), 
    Field('sku', requires=[IS_NOT_EMPTY(), IS_ALPHANUMERIC()], label='SKU'), 
    Field('build', requires=IS_IN_SET(['Build1','Build2','Build3']), label='Product Type'), 
    db.category_t 
) 


我還沒有想出如何將其顯示爲可多選元素。截至目前,它顯示爲一系列複選框。

回答

2

更新中的代碼沒有按照您的想法進行操作。通過將db.category_t添加到new_product表定義中,您只需在new_product表中添加一組完全獨立的類別字段即可。這些字段的數據將存儲在new_product表中,並且category_t表中不會存儲任何內容。如果您只想要一小組固定的布爾類別字段,則不需要category_t表 - 您應該只在new_product中定義這些字段。但是,每個類別將是一個單獨的輸入,因此您不會有單個多重選擇。

也許你想要的是list:stringlist:reference字段。最簡單的方法是一個list:string字段:

db.define_table('new_product', ..., 
    Field('main_categories', 'list:string', label='Categories', 
      requires=IS_IN_SET(['Category 1', 'Category 2', 'Category 3'], 
          multiple=True))) 

上面將存儲在main_categories字段類別名稱的列表,並且IS_IN_SET驗證器將限制選項,以特定的一組類別,將被顯示在一個多選框(由於multiple=True參數)。在這種情況下不需要單獨的類別表。

如果您由於某種原因想維護一個單獨的類別表(例如,某些元數據與每個類別相關聯,或者您希望頻繁地編輯類別名稱),則可以使用list:reference字段。然而,欄目表不應該被定義爲你的榜樣,而應爲每個類別一個單獨的記錄:

db.define_table('category', 
    Field('name'), 
    [other category metadata fields if needed], 
    format='%(name)s') 

db.define_table('new_product', ..., 
    Field('main_categories', 'list:reference category', label='Categories') 

在這種情況下,main_categories領域將獲得一個默認IS_IN_DB驗證,以及一個多選擇顯示類別名稱的小部件(這是通過設置爲「名稱」字段的category表定義中的「格式」參數啓用的)。

最後的選項是設置一個完整的many-to-many schema,它需要第三個表。但是,這會使設置表單條目變得複雜,因爲沒有內置方法來創建具有多選對多對多關係的new_product條目表單。