繁体   English   中英

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

[英]How to combine two nested tuples and use in Django's CharField choices?

我有两个类似于下面的嵌套元组,它们将用于 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()接受,即以下条件就足够了:

一个可迭代对象(例如,列表或元组)由恰好两个项目(例如 [(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) (BONUS) 如何使用 COMPANY_INFO 轻松进行查找? 具体来说,获得以下问题的答案的 Python 代码是什么:“美国的公司缩写是什么?”

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

一个ForeignKey到款,也很容易让你查询数据库,进行更改,并额外的数据存储有关公司/经理。

如果选择是静态的,通常会使用带有选择的CharField s:例如,美国的州可能非常静态(几十年前就有计划将梵蒂冈、英国等作为美国的州,但作为据我所知,这些计划从未真正占据“势头”)。 一个人的性别是另一个。

但是公司和经理通常具有更动态的性质。 如果 Doyun Kim 不再是经理怎么办? 还是移居日本?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM