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

时间:2018-10-08 22:07:42

标签: python django nested tuples

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

  public sortComparer = (reference: string, comparer: string) => {
    if (reference == "Overdue") {
      return -2;
    }
    else if (reference == "Planned") {
      return -1;
    }
    else if (reference == "Completed") {
      return 1;
    }
    return 0;
  };

目前,我的工作领域如下:

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)

两个问题:

1)我如何编写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'), ) ), ) 以便使用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接受即可,即满足以下条件即可:

  

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

2)(奖励)如何使用model.Charfield()轻松进行查找?具体来说,什么是获得以下问题答案的Python代码:“在美国的公司缩写是什么?”,“'siu'的名字和姓氏是什么?”。

1 个答案:

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

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

通过ForeignKey进行建模,还可以轻松地查询数据库,进行更改并存储有关公司/经理的额外数据。

如果选择是静态,通常会使用带有选择的

CharField:例如,美国的州可能是相当静态的(几十年前就有计划制定梵蒂冈,大不列颠等美国的州,但据我所知,这些计划从来没有真正采取过“动力”。一个人的性别是另一个。

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