Какой самый эффективный способ отменить поиск по кортежу кортежей? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть поле выбора со списком кортежей:

EVENT_CHOICES = [(1, "queued"), (2, "sent"), (3, "failed")]

Это сохраняется как PositiveSmallIntegerField, а не CharField по причинам производительности:

event_type = models.PositiveSmallIntegerField(choices=EVENT_TYPE_CHOICES)

В моем приложении поле заполняется через веб-крючок для внешнего источника, который POSTS является str компонентом кортежа. Например, я получаю queued, sent или failed в качестве переменной POST.

Какой самый простой / наиболее эффективный способ отменить поиск на EVENT_CHOICES и вернуть int из str?

Например, неуклюжий длинный способ будет выглядеть так:

if event == "queued":
   event_type = 1
if event == "sent":
   event_type = 2
if event == "failed":
   event_type = 3

Учитывая, что у меня действительно много вариантов, я предполагаю, что для этого должен быть более аккуратный способ?

1 Ответ

4 голосов
/ 17 марта 2020

если вам просто нужно сделать один поиск, вы можете просто повторить его

def get_idx(choice):
    for idx,evt in EVENT_CHOICES:
        if evt == choice:
           return idx

или если вы собираетесь сделать это более одного раза, вы должны создать обратный dict

dataReversed = {choice:idx for idx,choice in EVENT_CHOICES}
dataReversed.get('queued')
...