Django: Фильтр по меньшему количеству слов (имя базы данных) в классе TextChoices

У меня есть модель:

class RegulationModel(models.Model):

    class Markets(models.TextChoices):
        EUROPE = 'E', 'Europe'
        US = 'US', 'US'
        JAPAN = 'J', 'Japan'
        KOREA = 'K', 'Korea'
        BRAZIL = 'B', 'Brazil'
        INDIA = 'I', 'India'
        CHINA = 'C', 'China'

    market = models.CharField(verbose_name='Market:', max_length=2, choices=Markets.choices)
    [... more fields ..]

Как отфильтровать более многословный выбор в классе Markets?

Например, если я хочу отфильтровать "Китай", я хочу сделать что-то вроде:

regulation = RegulationModel.objects.get(market__verbose='China')

(я знаю, что это невозможно, но это просто чтобы получить представление)

Причина, по которой я это делаю, заключается в том, что я получаю выбор из AJAX, поэтому формат не ["C", "US"] .etc.

Я смог преобразовать значение verbose в значение базы данных с помощью:

>> market = 'China'
>> market_db = {y:x for x, y in RegulationModel.Markets._value2label_map_.items()}[market]
>> market_db
'C'

И тогда я мог бы использовать это для запросов, но это не кажется очень питоническим.

Я считаю, что вы можете сделать следующее:

china_code = list(filter(lambda x: x[1] == 'China', RegulationModel.Market.choices)).pop()[1]
regulation = RegulationModel.objects.get(market=china_code)

Но это немного халтурно. Я рекомендую использовать django-useful и его реализацию Choices.

Вернуться на верх