web2py中的多对多关系

时间:2012-07-04 21:00:38

标签: database-design many-to-many relational-database relationship 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书中收集的内容来看,没有直接支持多对多关系。为了解决这个问题,一个简单的解决方法是使用一个处理关系的中间表,但显然我不是数据库专家,所以我几乎不知道应该怎么做。

非常感谢一些帮助!

1 个答案:

答案 0 :(得分: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字段。