如何组合两个嵌套元组并在 Django 的 CharField 选择中使用?



我有两个类似于下面的嵌套元组,它们将用于 Django 模型中的选择。查菲尔德((。

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()接受,即以下条件就足够了:

可迭代对象(例如,列表或元组(由 正好有两个项目(例如 [(A, B(, (A, B( ...]( 用作选择 此字段。

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((奖金(如何使用COMPANY_INFO轻松进行查找?具体来说,Python代码是什么来获得以下问题的答案:"美国的公司缩写是什么?

我认为为CompanyManager制作单独的模型可能更有意义。在这里,您的数据是静态的,例如,如果您想添加公司/经理、重命名或删除公司/经理,这可能会导致一些问题。

模型ForeignKey还允许您查询数据库、进行更改以及存储有关公司/经理的额外数据。

如果选择是静态的,通常使用带有选择CharField:例如,美国的州可能是相当静态的(几十年前就计划让梵蒂冈、英国等成为美国国家,但据我所知,这些计划从未真正采取"势头"(。一个人的性别是另一个。

但公司和经理人通常具有更具活力的性质。如果金斗云不再是经理怎么办?还是搬到日本?

最新更新