【问题标题】:How to combine two nested tuples and use in Django's CharField choices?如何组合两个嵌套元组并在 Django 的 CharField 选项中使用?
【发布时间】:2018-10-08 22:07:42
【问题描述】:

我有两个类似于下面的嵌套元组,它们将用于 Django 的model.CharField() 中的choices

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) (BONUS) 如何使用COMPANY_INFO 轻松进行查找?具体来说,可以用什么 Python 代码来回答以下问题:“美国的公司缩写是什么?”、“'siu' 的名字和姓氏是什么?”。

【问题讨论】:

    标签: python django nested tuples


    【解决方案1】:

    是的,您可以将其指定为:

    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,还可以让您轻松查询数据库、进行更改以及存储有关公司/经理的额外数据。

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

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

    【讨论】:

    • 谢谢,第一部分正是我想要的。对于第二部分,两个表(Companies、Managers)几乎是静态的,数据最多是上面示例数据的两倍。我可以按照您的建议创建两个表。但每个都是最多 20 行的表格。我主要关心的实际上是性能,即缓慢的表查找。第二个小问题是更复杂的整体模型。您认为添加两个额外的模型(为了便于查找)会影响性能吗?
    • @Hbat:我自己的经验是,通常 one 查询没有那么问题,更多的是 N+1 问题有问题,但是使用适当的.select_related(..).prefetch_related(..),JOINing 的时间通常是非常有限的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多