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