python - 如何组合两个嵌套元组并在 Django 的 CharField 选项中使用?
问题描述
我有两个类似于下面的嵌套元组,它们将用于Django 的model.CharField()中的选择。
COMPANIES = (
('USA', (
('gm', 'General Motors'),
('tesla', 'Tesla'),
('ford', 'Ford')
)
),
('South Korea', (
('kia', 'Kia Motors'),
('hyundai', 'Hyundai Motors'),
)
),
('Japan', (
('nissan', 'Nissan Motors'),
('honda', 'Honda Motors'),
('toyota', 'Toyota Motors'),
)
),
)
MANAGERS = (
('USA', (
('jack', 'Jack Smith'),
('doyun', 'Doyun Kim'),
('jill', 'Jill Maggie'),
('akari', 'Akari Tanaka'),
)
),
('South Korea', (
('doyun', 'Doyun Kim'),
('siu', 'Siu Park'),
('jill', 'Jill Maggie'),
)
),
('Japan', (
('akari', 'Akari Tanaka'),
('jack', 'Jack Smith'),
('haruto', 'Haruto Nakamura'),
)
),
)
目前我的工作领域是这样的:
companies = models.CharField(max_length=30, choices=COMPANIES)
managers = models.CharField(max_length=50, choices=MANAGERS)
但为了数据的保真度,我不想重复国家名称两次,并且可能有这样的数据(或类似的数据):
COMPANY_INFO = (
('USA', (
('gm', 'General Motors'),
('tesla', 'Tesla'),
('ford', 'Ford')
), (
('jack', 'Jack Smith'),
('doyun', 'Doyun Kim'),
('jill', 'Jill Maggie'),
('akari', 'Akari Tanaka'),
)
),
('South Korea', (
('kia', 'Kia Motors'),
('hyundai', 'Hyundai Motors'),
), (
('doyun', 'Doyun Kim'),
('siu', 'Siu Park'),
('jill', 'Jill Maggie'),
)
),
('Japan', (
('nissan', 'Nissan Motors'),
('honda', 'Honda Motors'),
('toyota', 'Toyota Motors'),
), (
('akari', 'Akari Tanaka'),
('jack', 'Jack Smith'),
('haruto', 'Haruto Nakamura'),
)
),
)
两个问题:
1)我怎样才能写出model.Charfield()
它才能使用COMPANY_INFO
?
companies = models.CharField(max_length=30, choices=COMPANY_INFO[some magic here])
managers = models.CharField(max_length=50, choices=COMPANY_INFO[some other magic here])
COMPANY_INFO
不必是元组,只要它被 接受model.Charfield()
,即以下条件就足够了:
一个iterable(例如,一个列表或元组),它本身由恰好两个项目(例如[(A,B),(A,B)...])的iterables组成,用作该字段的选择。
2)(奖金)我怎样才能轻松使用查找COMPANY_INFO
?具体来说,获取以下问题的答案的 Python 代码是什么:“美国的公司缩写是什么?”、“'siu' 的名字和姓氏是什么?”。
解决方案
是的,您可以将其指定为:
COMPANIES = tuple((k, v) for (k, v, __) in COMPANY_INFO)
MANAGERS = tuple((k, v) for (k, __, v) in COMPANY_INFO)
因此,您可以在您的字段中定义它,例如:
companies = models.CharField(
max_length=30,
choices=tuple((k, v) for (k, v, __) in COMPANY_INFO)
)
managers = models.CharField(
max_length=50,
choices=tuple((k, v) for (k, __, v) in COMPANY_INFO)
)
但根据你的第二个问题:
2) (BONUS) 如何使用 COMPANY_INFO 轻松进行查找?具体来说,获取以下问题的答案的 Python 代码是什么:“美国的公司缩写是什么?”
Company
我认为为和制作单独的模型可能更有意义Manager
。在这里,您的数据是静态的,例如,如果您想添加公司/经理、重命名或删除公司,这可能会导致一些问题。
A ForeignKey
to models,还允许您轻松查询数据库、进行更改和存储有关公司/经理的额外数据。
CharField
如果选择是静态的,则通常使用带有选择的 s :例如,美国的州可能是相当静态的(几十年前就有计划将梵蒂冈、英国等设为美国的州,但到目前为止据我所知,这些计划从未真正获得过“动力”)。一个人的性别是另一个。
但公司和经理通常具有更具活力的性质。如果 Doyun Kim 不再是经理怎么办?还是移居日本?
推荐阅读
- arrays - 如何使单元格索引 path.row == 数组中的项目索引?
- locking - 取消搁置在 Perforce/P4 中排他签出的文件
- mysql - 更新 MySQL 数据库中特定记录的路径列
- javascript - 在画布上创建线条动画
- ios - 用于生成锁文件的 CocoaPods 版本(1.5.3)高于当前可执行文件的版本(1.5.2)
- google-apps-script - InlineQueryResultArticle of answerInlineQuery in Telegram Bot API with Google Apps Script
- javascript - 单击父组件中的元素时不显示子组件
- javascript - 使用带有 Getter/Setter 的构造函数初始化 JavaScript/ES5 对象
- reactjs - 动态生成的输入字段 - 如何访问值
- hyperledger-composer - 带有“CONTAINS”运算符的超级账本作曲家查询不起作用