3

我的文章的表在我類似這樣的web2py的項目:許多一對多在web2py的關係

db.define_table('articles', 
       Field('created_on', 'datetime', default = datetime.today(), 
         required = True, notnull = True, 
         requires = [IS_NOT_EMPTY(), 
            IS_DATETIME(format=T('%Y-%m-%d %H:%M:%S'))]), 
       Field('article_en', 'text', required = True, 
         notnull = True, requires = IS_NOT_EMPTY())) 

,另一種以跟蹤上傳的文件:

db.define_table('files', 
       Field('filename', 'string', required = True, notnull = True), 
       Field('uploaded_data', 'upload', autodelete = True, 
         required = True, notnull = True, requires = IS_NOT_EMPTY()), 
       Field('created_on', 'datetime', required = True, notnull = True)) 

現在我想爲每篇文章引用一篇文章,以及文件所屬的每篇文章的引用。我需要這個,所以我可以輕鬆刪除未使用的文件,而不會因爲被忽視的關係而弄亂文章。

說得更直截了當,這種關係非常接近: 每篇文章都有幾個文件,每個文件都鏈接到不同的文章。

從我從web2py書收集的內容中,沒有對多對多關係的直接支持。爲了解決這個問題,一個簡單的解決方法是使用處理關係的中間表,但顯然我不是數據庫大師,所以我很少不知道該怎麼做。

一些幫助將不勝感激!

回答

4

web2py確實支持many-to-many relationships。您可以通過定義一箇中間表聯接其他兩個表做到這一點:

db.define_table('article_files', 
    Field('article', db.articles), 
    Field('file', db.files)) 

這不是一個解決方法,但處理RDBMS中的這種關係的標準方式。請注意,web2py使用數據庫抽象層(DAL),而不是ORM。 ORM通常不會要求您明確定義中間表,儘管它仍然會在幕後創建。

您可能還會考慮使用list:reference字段。

+0

非常感謝。這正是我需要的。還有一個問題,使用list:reference而不是標準方法有什麼好處? – Athelionas

+1

根據你在做什麼,列表:引用可以使一些功能更容易編程,但它也包含一些限制(例如,如果從文件表中刪除給定記錄,則必須通過所有文章記錄並從任何文章列表中刪除該記錄ID:參考字段)。 – Anthony

+0

在這種情況下,我只會堅持標準的方式。在我的用例中它應該更有效率。感謝您抽出時間。 – Athelionas