【问题标题】:Reference another table in SQLite using Web2py/Python使用 Web2py/Python 在 SQLite 中引用另一个表
【发布时间】:2015-06-04 04:10:19
【问题描述】:

一般来说,我是 Web2py 和 SQL 数据库的新手,如果这是一个愚蠢的问题,请原谅我。

我要做的是创建一个表单,从 SQL 表的字段中提取相关数据(类型、标签、IS_NOT_EMPTY() 等),以在前端填充和配置输入元素。到目前为止,我已经成功地使用Web2py Manual 作为一个很好的参考来做到这一点。

我已经到了想要使用多个表来帮助更有效地对数据集进行分类的地步。最好的情况是有一个可以在我的控制器文件(default.py)中调用的主表,它与我的数据库中的其他相关(但并不总是需要)表链接。

在下面的代码中,您可以看到我先定义了“category_t”表,然后定义了“new_product”表。然后,我尝试在 new_product 的“main_category”字段中引用“category_t”表。 'main_category' 字段最终成为表单上的多选元素,这正是我想要的。我只需要使用 'category_t' 中的 字段标签 作为多选选项。

我使用的是 Web2py 手册中的 Links to referencing records 说明,但我相信我误解了它的实际功能。我迫切需要有人教我 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
)


我还没有弄清楚如何将其显示为多选元素。截至目前,它显示为一系列复选框。

【问题讨论】:

    标签: sqlite python-2.7 web2py


    【解决方案1】:

    您更新中的代码没有按照您的想法执行。通过将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验证器会将选项限制为一组特定的类别,这些类别将显示在一个多选框中(由于@987654334 @ 争论)。在这种情况下不需要单独的类别表。

    如果您出于某种原因想要维护一个单独的类别表(例如,有一些与每个类别关联的元数据,或者您希望经常编辑类别名称),您可以改用 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 条目表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 2012-07-04
      • 2021-05-01
      相关资源
      最近更新 更多