Как объединить два вложенных кортежа и использовать их в Django CharField? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть два вложенных кортежа, похожих на приведенные ниже, которые будут использоваться в вариантах в Django's 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, чтобы получить ответы на такие вопросы, как: «Каковы сокращения компаний в США?», «Какое имя и фамилия у« сиу »?».

1 Ответ

0 голосов
/ 09 октября 2018

Да, вы можете указать это как:

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, чтобы получить ответы на такие вопросы, как: «Какие сокращения компании в США?»

Я думаю, что было бы более разумно создавать отдельные модели для Company и Manager.Здесь ваши данные статичны, что может привести к некоторым проблемам, если, например, вы хотите добавить компанию / менеджера, переименовать или удалить одну.

A ForeignKey к моделям,также позволяет легко запрашивать базу данных, вносить изменения и хранить дополнительные данные о компании / менеджере.

CharField с вариантами, как правило, используются, если варианты статические : дляНапример, штаты в США, вероятно, довольно статичны (ну, несколько десятилетий назад были планы создания штатов Ватикан, Великобритания и т. д., но, насколько я знаю, эти планы никогда не набирали обороты),Пол другого человека.

Но компании и менеджеры обычно имеют более динамичный характер.Что если Доюн Ким больше не менеджер?Или переезжает в Японию?

...