簡體   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