gpt4 book ai didi

sqlite - 使用 Web2py/Python 在 SQLite 中引用另一个表

转载 作者:行者123 更新时间:2023-12-03 18:49:59 24 4
gpt4 key购买 nike

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

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

我已经到了想要使用多个表来帮助更有效地对数据集进行分类的地步。最好的情况是有一个可以在我的 Controller 文件(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
)

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

最佳答案

您更新中的代码没有按照您的想法执行。通过添加 db.category_tnew_product表定义,您只需将一组完全独立的类别字段添加到 new_product table 。这些字段的数据将存储在 new_product表,并且没有任何内容将存储在 category_t table 。如果您只需要一组固定的 bool 类别字段,那么 category_t table 是不必要的——你应该在 new_product 中定义这些字段。 .但是,每个类别都将是一个单独的输入,因此您不会有一个多选。

可能你想要的是 list:stringlist:reference field 。最简单的方法是 list:string field :

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 field 。但是,不应像您的示例中那样定义类别表,而应为每个类别分别记录:
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 条目表单。

关于sqlite - 使用 Web2py/Python 在 SQLite 中引用另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com